> 文章列表 > Hive Explain查看执行计划

Hive Explain查看执行计划

Hive Explain查看执行计划

前言

在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 stageStage-0 depends on stages: Stage-1
STAGE PLANS:Stage: Stage-1Map ReduceMap Operator Tree:TableScanalias: test1Statistics: Num rows: 6 Data size: 75 Basic stats: COMPLETE Column stats: NONESelect Operatorexpressions: id (type: int)outputColumnNames: idStatistics: Num rows: 6 Data size: 75 Basic stats: COMPLETE Column stats: NONEGroup By Operatoraggregations: sum(id)mode: hashoutputColumnNames: _col0Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: NONEReduce Output Operatorsort order:Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: NONEvalue expressions: _col0 (type: bigint)Reduce Operator Tree:Group By Operatoraggregations: sum(VALUE._col0)mode: mergepartialoutputColumnNames: _col0Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: NONEFile Output Operatorcompressed: falseStatistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: NONEtable:input format: org.apache.hadoop.mapred.SequenceFileInputFormatoutput format: org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormatserde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDeStage: Stage-0Fetch Operatorlimit: -1Processor 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:

  1. TableScan
    表扫描操作,即加载表。
    常见属性:

alias: 表名称
Statistics: 表统计信息,包含表中数据条数,数据大小等

  1. Select Operator
    select操作,常见属性:

expressions:需要查询的字段和类型
outputColumnNames:需要输出的字段
Statistics:表统计信息,包含表中数据条数,数据大小等

  1. Group By Operator
    分组聚合操作,常见属性:

aggregations:显示聚合函数信息
mode:聚合模式,值有 hash:随机聚合,就是hash partition;partial:局部聚合;final:最终聚合
keys:分组的字段,如果没有分组,则没有此字段
outputColumnNames:聚合之后需要输出字段
Statistics: 表统计信息,包含分组聚合之后的数据条数,数据大小等

  1. Reduce Output Operator
    输出到reduce操作,常见属性:

sort order:值为空 不排序;值为 + 正序排序,值为 - 倒序排序;值为 ± 排序的列为两列,第一列为正序,第二列为倒序

  1. Filter Operator
    过滤操作,常见的属性:

predicate:过滤条件,如sql语句where id>=1,则此处显示(id >= 1)

  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完成之后生成的数据条数,大小等

  1. File Output Operator
    文件输出操作,常见属性:

compressed:是否压缩
table:表的信息,包含输入输出文件格式化方式,序列化方式等

  1. 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;

执行部分结果(下同):

TableScanalias: aStatistics: Num rows: 6 Data size: 75 Basic stats: COMPLETE Column stats: NONEFilter Operatorpredicate: id is not null (type: boolean)Statistics: Num rows: 6 Data size: 75 Basic stats: COMPLETE Column stats: NONESelect Operatorexpressions: id (type: int)outputColumnNames: _col0Statistics: Num rows: 6 Data size: 75 Basic stats: COMPLETE Column stats: NONEHashTable Sink Operatorkeys: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;

执行部分结果:

TableScanalias: test1Statistics: Num rows: 9 Data size: 108 Basic stats: COMPLETE Column stats: NONESelect Operatorexpressions: id (type: int), name (type: string)outputColumnNames: id, nameStatistics: Num rows: 9 Data size: 108 Basic stats: COMPLETE Column stats: NONEGroup By Operatoraggregations: max(name)keys: id (type: int)mode: hashoutputColumnNames: _col0, _col1Statistics: Num rows: 9 Data size: 108 Basic stats: COMPLETE Column stats: NONEReduce Output Operatorkey 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: NONEvalue expressions: _col1 (type: string)

从上述结果看到sort order: + ,说明是按照id字段进行正序排序的。

总结

Hive的explain 还有很多其他的用途,如查看stage的依赖情况、排查数据倾斜、hive 调优等,小伙伴们可以自行尝试。