跳至主要內容
Hive调优

一、使用EXPLAIN

	查看逻辑,更多用 EXPLAIN EXTENDED

二、限制调整LIMIT

三、JOIN优化

	表足够小用map-side JOIN

四、本地模式

对于小数据集,单机或单线程执行时间比较短
hive> set oldjobtracker=${hiveconf.mapred.job.tracker};
hive> set mapred.job.tracker=local;
hive> set mapred.tmp.dir=/home/edward/tmp
hive> SELECT * from people WHERE firstname=bob;
hive> set mapred.job.tracker=${oldjobtracker};

zheng小于 1 分钟大数据hive
Hive模式设计

一、分区

Hive 中分区的功能是非常有用的。因为通常要对输入进行全盘扫描,来满足查询条件。

如:存储日志,log_2020_01_01、log_2020_01_02等

hive> CREATE TABLE 

hive> CREATE TABLE log_2020_01_01 (id int, part string, quantity int);
hive> CREATE TABLE log_2020_01_02 (id int, part string, quantity int);
hive> CREATE TABLE log_2020_01_04 (id int, part string, quantity int);

hive> SELECT part,quantity log_2020_01_01
    > UNION ALL
    > SELECT part,quantity from log_2020_01_04
    > WHERE quantity < 4;

zheng大约 3 分钟大数据hive
Hive索引
	Hive没有键的概念,可以对一些字段建立索引来加速某些操作,一张表的索引储存在另外一张表中。EXPLAIN命令可以查看某个查询语句是否用到了索引。

一、建索引语法

// 定义表
CREATE TABLE employees(
name STRING,
salary FLOAT,
subordinates ARRAY<STRING>,
deductions MAP<STRING, FLOAT>,
address STRUCT<street:STRING, city:STRING, state:STRING, zip:INT>
)
PARTITIONED BY (country STRING, state STRING); // 分区:hdfs://xxx/2020/02/20/xx

// 建立索引,仅对字段country建立索引 
CREATE INDEX employees_index
ON TABLE employees(country)
// AS ... 指定索引处理器
AS 'org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler'
WITH DEFERRED REBUILD
IDXPROPERTIES('creator' = 'me', 'created_at' = 'some_time')
IN TABLE employees_index_table
PARTITIONED BY (country, name)
COMMENT 'Employees indexed by country and name.'

zheng大约 1 分钟大数据hive
HiveQL视图
	视图可以允许保存一个查询(并)像对待表一样对这个查询进行操作。(这是一个逻辑结构,因为它不像一个表会存储数据。

一、使用视图来降低查询复杂度

当查询长且复杂,通过使用视图将这个查询语句分割成多个小的、更可控的片段可以降低这种复杂度。

例如:

改进前:Hive 查询语句中含有多层嵌套

FROM(
	SELECT * FROM people JOIN cart ON (cart.people_id=people.id) WHERE firstname='john'
) a SELECT a.lastname WHERE a.id=3;

zheng大约 2 分钟大数据hive
Hive数据操作(3)

一、类型转换

	(1)cast() 函数,可以使用这个函数对指定的值进行显式的类型转换。

例如:

// 当salary字段的值是不合法的浮点数字符串的话,Hive会返回NULL
SELECT name, salary FROM employees WHERE cast(salary AS FLOAT) < 100000.0;

zheng大约 2 分钟大数据hive
Hive数据操作(2)

Hive 中 SQL JOIN 语句,只支持等值连接

一、INNER JOIN

内连接(INNER JOIN)中,只有进行连接的两个表中都存在于连接标准相匹配的数据才会被保留下来。不支持 >= 等不相等匹配、ON子句中谓词之间不能使用OR。
// 苹果公司股价 AAPL   IBM股价IBM
// ON子句指定了两个表间数据进行连接的条件
// WHERE子句限制了左边表是AAPL的记录,右边表是IBM的记录

hive> SELECT a.ymd, a.price_close, b.price_close
	>FROM stocks a JOIN stocks b ON a.ymd = b.ymd 
	>WHERE a.symbol = 'AAPL' AND b.symbol = 'IBM';

2010-01-04  214.01  132.45
2010-01-05  214.38  130.85
...

zheng大约 5 分钟大数据hive
Hive数据操作(1)

一、加载数据

Hive 没有行级别的数据插入、数据更新和删除操作,那么网表中装载数据的唯一途径就是使用一种 “ 大量 ” 的数据装载操作。或者通过其他方式仅仅将文件写入到正确的目录下。

// OVERWRITE关键字换成INTO关键字的话,Hive将会以追加的方式写入数据而不会覆盖之前已经存在的内容
LOAD DATA LOCAL INPATH '${env:HOME}/california-employees'  
OVERWRITE INTO TABLE employees
// 非分区表省略此行
PARTITION (country = 'US', state = 'CA')  

zheng大约 4 分钟大数据hive
Hive数据定义

一、Hive 与 Mysql不同

	Hive不支持行级插入操作、更新操作和删除操作,

	Hive不支持事务。	

二、Hive中的数据库

Hive 中数据库的概念本质上仅仅是表的一个目录或者命名空间。

// 1、数据库目录为:
hive.metastore.warehouse.dir

// 2、创建数据库 :
CREATE DATABASE financials;    

// 3、已经存在则: 
CREATE DATABASE IF NOT EXISTS financials;

// 4、查看数据库:
SHOW DATABASES;    SHOW DATABASES LIKE 'f.*';

// 5、修改默数据库位置:
CREATE DATABASE financials LOCATION '/my/preferred/directory';

// 6、切换工作数据库:
USE financials;

 (Hive v0.8.0,可以修改当前工作数据库为默认数据库,set hive.cli.print.current.db=true;)

// 7、删除数据库:
DROP DATABASE IF EXISTS financials;

zheng大约 3 分钟大数据hive