附书代码Github工程:https://github.com/Shadow-Hunter-X
SELECT子句
- 针对复合类型列的查询(数组,字典,结构)
含有复合类型列的样表:
CREATE TABLE IF NOT EXISTS employees_t
(
name STRING COMMENT 'Employee name',
salary FLOAT COMMENT 'Employee salary',
subordinates ARRAY<STRING> COMMENT ' Names of subordinates',
deducations MAP<STRING,FLOAT> COMMENT ' Keys are deducations names , Values are percentags',
address STRUCT<street:STRING,city:STRING,state:STRING,zip:INT> COMMENT 'Home Address'
)
COMMENT 'the table of empoyee'
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\001'
COLLECTION ITEMS TERMINATED BY '\002'
MAP KEYS TERMINATED BY '\003'
LINES TERMINATED BY '\n'
STORED AS TEXTFILE;
数据样式:
访问数组列,使用下标索引:
SELECT name , subordinates[0] FROM employees_t linit 3;
访问Map元素,使用键值索引
SELECT name , deducations["State Taxes"] FROM employees_t limit 3;
访问struct中的元素,使用.
SELECT name , address.city FROM employees_t limit 3;
函数
对于Hive提供了丰富的内置函数,请查阅JOIN子句
针对在标准SQL中定义个各种连接在Hive中都有相应支持,但是又去对于Hive的一些独特性。-
Hive连接中对表的执行的顺序是从左到右,逐个扫描
所以在查询中将的表的大小从左到右增加,这样可以达到优化的目的,将小表放到内存,提高执行速度
开启的优化项:set hive.auto.convert.join=true; -
LEFT SEMI-JOIN
左半开表,放回左边表的记录,前提是其记录对于右边表满足ON语句中的判断条件
排序
*order by 和 sort by* order by 对执行的数据集进行一次全局排序,这样是通过一个reducer进行处理,当数据量很大的时候,将会很费时。 对于Hive中增加了sort by只会对每个reducer进行排序,进行一次局部的排序,只是保证每个reducer的输出是有序的。 有助于后续的全局排序提高效率。由于order by 操作可能会造成运行时间很长,如果属性hive.mappred.mode的值是strict,那hive 查询中必须有limit 。