前言
在MySQL中,我们常常使用explain这个命令来查看一些SQL语句的执行计划,查看该SQL语句有没有使用上了索引,有没有做全表扫描,来了解MySQL当运行SQL语句时哪种策略预计会被优化器采用的细节。那么,在Hive中,也提供了explain命令来展示一个查询的执行计划,这个执行计划对于我们了解底层原理,hive调优,排查数据倾斜等方面,能够给我们的工作带来极大的便利,如果不懂hive中的explain,说明hive还没入门,今天就和小伙伴们一起深入学习一下!
1. explain的用法和参数介绍
1.1 使用语法:
EXPLAIN [EXTENDED|CBO|AST|DEPENDENCY|AUTHORIZATION|LOCKS|VECTORIZATION|ANALYZE] query
EXPLAIN 后跟可选参数说明:
- EXTENDED:可以输出有关执行计划的额外信息,通常是物理信息,比如文件名。
- CBO:输出由Calcite优化器生成的计划。CBO 从 hive 4.0.0 版本开始支持
- AST:输出查询的抽象语法树。AST 在hive 2.1.0 版本删除了,存在bug,转储AST可能会导致OOM错误,将在4.0.0版本修复
- DEPENDENCY:在EXPLAIN语句中使用会产生有关计划中输入的额外信息。它显示了输入的各种属性
- AUTHORIZATION:显示所有的实体需要被授权执行(如果存在)的查询和授权失败
- LOCKS:这对于了解系统将获得哪些锁以运行指定的查询很有用。LOCKS 从 hive 3.2.0 开始支持
- VECTORIZATION:将详细信息添加到EXPLAIN输出中,以显示为什么未对Map和Reduce进行矢量化。从 Hive 2.3.0 开始支持
- ANALYZE:用实际的行数注释计划。从 Hive 2.2.0 开始支持
1.2 执行实例
执行如下命令:
explain select sum(id) from test1;
得到结果:
STAGE DEPENDENCIES: Stage-1 is a root stage Stage-0 depends on stages: Stage-1 STAGE PLANS: Stage: Stage-1 Map Reduce Map Operator Tree: TableScan alias: test1 Statistics: Num rows: 6 Data size: 75 Basic stats: COMPLETE Column stats: NONE Select Operator expressions: id (type: int) outputColumnNames: id Statistics: Num rows: 6 Data size: 75 Basic stats: COMPLETE Column stats: NONE Group By Operator aggregations: sum(id) mode: hash outputColumnNames: _col0 Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: NONE Reduce Output Operator sort order: Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: NONE value expressions: _col0 (type: bigint) Reduce Operator Tree: Group By Operator aggregations: sum(VALUE._col0) mode: mergepartial outputColumnNames: _col0 Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: NONE File Output Operator compressed: false Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: NONE table: input format: org.apache.hadoop.mapred.SequenceFileInputFormat output format: org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe Stage: Stage-0 Fetch Operator limit: -1 Processor Tree: ListSink
我们就上面的结果进行分析:包含两个部分
1. STAGE DEPENDENCIES
各个stage之间的依赖性:包含两个stage
Stage-1:root stage,即根stage
Stage-0:依赖Stage-1,即在Stage-1执行完成后才执行
2. STAGE PLANS
可以看到有一个MapReduce,它的执行计划分为两部分:
- Map Operator Tree:Map端执行计划树
- Reduce Operator Tree:Reduce端执行计划树
下面具体介绍一下执行计划树中的Operator:
- TableScan
表扫描操作,即加载表。
常见属性:
alias: 表名称
Statistics: 表统计信息,包含表中数据条数,数据大小等
- Select Operator
select操作,常见属性:
expressions:需要查询的字段和类型
outputColumnNames:需要输出的字段
Statistics:表统计信息,包含表中数据条数,数据大小等
- Group By Operator
分组聚合操作,常见属性:
aggregations:显示聚合函数信息
mode:聚合模式,值有 hash:随机聚合,就是hash partition;partial:局部聚合;final:最终聚合
keys:分组的字段,如果没有分组,则没有此字段
outputColumnNames:聚合之后需要输出字段
Statistics: 表统计信息,包含分组聚合之后的数据条数,数据大小等
- Reduce Output Operator
输出到reduce操作,常见属性:
sort order:值为空 不排序;值为 + 正序排序,值为 - 倒序排序;值为 ± 排序的列为两列,第一列为正序,第二列为倒序
- Filter Operator
过滤操作,常见的属性:
predicate:过滤条件,如sql语句where id>=1,则此处显示(id >= 1)
- Map Join Operator
join 操作,常见属性:
condition map:join方式 ,如Inner Join 0 to 1 Left Outer Join 0 to 2
keys:join 的条件字段
outputColumnNames: join 完成之后输出的字段
Statistics: join完成之后生成的数据条数,大小等
- File Output Operator
文件输出操作,常见属性:
compressed:是否压缩
table:表的信息,包含输入输出文件格式化方式,序列化方式等
- Fetch Operator
客户端获取数据操作,常见属性:
limit,值为 -1 表示不限制条数,其他值为限制的条数
2. 生产实践
2.1 join语句过滤null值
执行语句:
explain select a.id,b.name from test1 a join test2 b on a.id=b.id;
执行部分结果(下同):
TableScan alias: a Statistics: Num rows: 6 Data size: 75 Basic stats: COMPLETE Column stats: NONE Filter Operator predicate: id is not null (type: boolean) Statistics: Num rows: 6 Data size: 75 Basic stats: COMPLETE Column stats: NONE Select Operator expressions: id (type: int) outputColumnNames: _col0 Statistics: Num rows: 6 Data size: 75 Basic stats: COMPLETE Column stats: NONE HashTable Sink Operator keys: 0 _col0 (type: int) 1 _col0 (type: int)
从这句predicate: id is not null (type: boolean)可以看出, join 时会自动过滤掉关联字段为 null的情况。
注意:left join 或 full join 是不会自动过滤的
2.2 group by分组会进行排序
执行语句:
select id,max(name) from test1 group by id;
执行部分结果:
TableScan alias: test1 Statistics: Num rows: 9 Data size: 108 Basic stats: COMPLETE Column stats: NONE Select Operator expressions: id (type: int), name (type: string) outputColumnNames: id, name Statistics: Num rows: 9 Data size: 108 Basic stats: COMPLETE Column stats: NONE Group By Operator aggregations: max(name) keys: id (type: int) mode: hash outputColumnNames: _col0, _col1 Statistics: Num rows: 9 Data size: 108 Basic stats: COMPLETE Column stats: NONE Reduce Output Operator key expressions: _col0 (type: int) sort order: + Map-reduce partition columns: _col0 (type: int) Statistics: Num rows: 9 Data size: 108 Basic stats: COMPLETE Column stats: NONE value expressions: _col1 (type: string)
从上述结果看到sort order: + ,说明是按照id字段进行正序排序的。
总结
Hive的explain 还有很多其他的用途,如查看stage的依赖情况、排查数据倾斜、hive 调优等,小伙伴们可以自行尝试。