基本语法

  1. EXPLAIN [EXTENDED|CBO|AST|DEPENDENCY|
  2. AUTHORIZATION|LOCKS|VECTORIZATION|ANALYZE] query
  1. EXTENDED:加上 extended 可以输出有关计划的额外信息。这通常是物理信息,例如文件名。这些额外信息对我们用处不大
  2. CBO:输出由Calcite优化器生成的计划。CBO 从 hive 4.0.0 版本开始支持
  3. AST:输出查询的抽象语法树。AST 在hive 2.1.0 版本删除了,存在bug,转储AST可能会导致OOM错误,将在4.0.0版本修复
  4. DEPENDENCY:dependency在EXPLAIN语句中使用会产生有关计划中输入的额外信息。它显示了输入的各种属性
  5. AUTHORIZATION:显示所有的实体需要被授权执行(如果存在)的查询和授权失败
  6. LOCKS:这对于了解系统将获得哪些锁以运行指定的查询很有用。LOCKS 从 hive 3.2.0 开始支持
  7. VECTORIZATION:将详细信息添加到EXPLAIN输出中,以显示为什么未对Map和Reduce进行矢量化。从 Hive 2.3.0 开始支持
  8. ANALYZE:用实际的行数注释计划。从 Hive 2.2.0 开始支持

    关键字

  • 最外层两部分:stage dependencies各个stage之间的依赖性、stage plan各个stage的执行计划
  • Stage-1是一个MapReduce,有两部分:Map Operator Tree MAP端的执行计划树、Reduce Operator Tree Reduce端的执行计划树
  • TableScan 表扫描操作:
    • alias 表名称
    • statistics 表的统计信息(条数、数据大小)
  • Select Operator 选取操作:
    • 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、Outer Join
    • keys: join的条件字段
    • outputColumnNames: join完成之后输出的字段
    • Statistics: join完成之后生成的数据条数,大小等
  • File Output Operator 文件输出操作:
    • compressed:是否压缩
    • table:表的信息,包含输入输出文件格式化方式,序列化方式等
  • Fetch Operator 客户端获取数据操作:
    • limit,值为 -1 表示不限制条数,其他值为限制的条数

      demo

      ```sql 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

<a name="MMUci"></a>
### explain解迷惑

- ** join 时会自动过滤掉关联字段为 null 值的情况,但 left join 或 full join 是不会自动过滤的**
- **group by 分组语句会进行排序吗? **sort order: + ,说明是按照 id 字段进行正序排序
- **下面哪个sql效率高?**执行计划完全一样,hive 底层会自动帮我们进行优化,所以这两条sql语句执行效率是一样

SELECT a.id, b.user_name FROM test1 a JOIN test2 b ON a.id = b.id WHERE a.id > 2;

```
SELECT
    a.id,
    b.user_name
FROM
    (SELECT * FROM test1 WHERE id > 2) a
JOIN test2 b ON a.id = b.id;