第五章目录
第五章 Hive
5.1 Hive 运行原理(源码级)
- 用户提交查询等任务给Driver。
- Antlr解析器将SQL转化为抽象语法树AST Tree
- 遍历AST Tree,抽出基本的查询单元QueryBlock
- 遍历QueryBlock,翻译为执行操作树OperatorTree
- 逻辑层优化器进行OperatorTree变换,合并不必要的ReduceSinkOperator,减少shuffle数据量
- 遍历OperatorTree,翻译为MapReduce任务
- 物理层优化器进行MapReduce任务的变换,生成最终的执行计划
- 执行计划,返回结果
5.2 Hive转化join为MR的原理
5.2.1 reduce端join
map端读取两个表,为两个表的数据分别打上标签tag,发送数据
reduce端根据分区分组规则拿到的数据时key相同的数据,再根据标签tag进行相同key的不同value的join操作,完成实际的连接。
5.2.2 map端join
将小表复制多份存放在每个map task的内存中,然后只扫描大表,对大表中key在小表中存在时,进行一个join拼接操作。
将小表复制的对象方法为DistributedCache.addCacheFile,要使用时再使用相应的提取文件目录的方法,并用标准IO获取到数据。
5.2.3 semi join
先将参与join的表1的key复制到一个新的表3中,然后把新表复制多份到各个map task中,最后将不在新表3的表2的数据过滤掉,再进行reduce。
5.3 Hive 建表
5.3.1 传统方式建表
#TEMPORARY:临时的 EXTERNAL:外部的
create [TEMPORARY,EXTERNAL] table [if not exist] [db_name.]name(
col_name data_type
...
)
#指定分区字段和类型(字段不在建表语句中)
[PARTITIONED BY (col_name data_type,...)]
#指定分桶字段和数量(字段存在建表语句中)
[
CLUSTERED BY (col_name, col_name, ...)
[SORTED BY (col_name [ASC|DESC], ...)]
INTO num_buckets BUCKETS
]
#指定解析格式
[ROW FORMAT row_format]
#二选一使用hive自带的或自定义OutPutFormat时引入包
STORED AS file_format |
STORED BY *'storage.handler.class.name' [WITH SERDEPROPERTIES (...)]*
#外部表创建时必须指定
[LOCATION hdfs_path]
#指定表的其它属性,这里可以设置压缩格式
[TBLPROPERTIES (property_name=property_value, ...)]
row_format
#DELIMITED 与 SERDE 方式二选一指定使用 hive自带的解析方式或自定义解析
DELIMITED
[FIELDS TERMINATED BY char [ESCAPED BY char]]
[COLLECTION ITEMS TERMINATED BY char]
[MAP KEYS TERMINATED BY char]
[LINES TERMINATED BY char]
[NULL DEFINED AS char] -- (Note: Available in Hive 0.13 and later)
SERDE serde_name [WITH SERDEPROPERTIES (property_name=property_value, property_name=property_value, ...)]
数据类型
TINYINT | SMALLINT | INT | BIGINT | BOOLEAN | FLOAT | DOUBLE | DOUBLE PRECISION -- (Note: Available in Hive 2.2.0 and later) | STRING | BINARY -- (Note: Available in Hive 0.8.0 and later) | TIMESTAMP -- (Note: Available in Hive 0.8.0 and later) | DECIMAL -- (Note: Availabl