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 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:

  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;

执行部分结果(下同):

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 调优等,小伙伴们可以自行尝试。

相关文章
|
SQL 存储 分布式计算
Hive底层原理:explain执行计划详解(一)
不懂hive中的explain,说明hive还没入门,学会explain,能够给我们工作中使用hive带来极大的便利!
927 0
|
存储 SQL 分布式计算
工作常用之Hive 调优【三】 Explain 查看执行计划及建表优化
在查询时通过 WHERE 子句中的表达式选择查询所需要的指定的分区,这样的查询效率会提高很多,所以我们需要把常常用在 WHERE 语句中的字段指定为表的分区字段。
391 0
工作常用之Hive 调优【三】 Explain 查看执行计划及建表优化
|
SQL HIVE
Hive底层原理:explain执行计划详解(二)
不懂hive中的explain,说明hive还没入门,学会explain,能够给我们工作中使用hive带来极大的便利!
375 0
|
SQL HIVE
Hive的HQL执行计划
一个Hive查询被转换成一个序列(更多的是一个有向无环图)的阶段。这些阶段可能是映射/还原阶段,甚至可能是进行转移或文件系统操作(如移动和重命名)的阶段
1712 0
|
7月前
|
SQL 数据采集 数据挖掘
大数据行业应用之Hive数据分析航班线路相关的各项指标
大数据行业应用之Hive数据分析航班线路相关的各项指标
211 1
|
7月前
|
SQL 存储 大数据
【大数据技术Hadoop+Spark】Hive基础SQL语法DDL、DML、DQL讲解及演示(附SQL语句)
【大数据技术Hadoop+Spark】Hive基础SQL语法DDL、DML、DQL讲解及演示(附SQL语句)
272 0
|
7月前
|
SQL 分布式计算 数据库
【大数据技术Spark】Spark SQL操作Dataframe、读写MySQL、Hive数据库实战(附源码)
【大数据技术Spark】Spark SQL操作Dataframe、读写MySQL、Hive数据库实战(附源码)
309 0
|
7月前
|
SQL 存储 分布式计算
【大数据技术Hadoop+Spark】Hive数据仓库架构、优缺点、数据模型介绍(图文解释 超详细)
【大数据技术Hadoop+Spark】Hive数据仓库架构、优缺点、数据模型介绍(图文解释 超详细)
1166 0
|
2月前
|
SQL 分布式计算 Java
大数据-96 Spark 集群 SparkSQL Scala编写SQL操作SparkSQL的数据源:JSON、CSV、JDBC、Hive
大数据-96 Spark 集群 SparkSQL Scala编写SQL操作SparkSQL的数据源:JSON、CSV、JDBC、Hive
68 0
|
5月前
|
SQL 分布式计算 大数据
大数据处理平台Hive详解
【7月更文挑战第15天】Hive作为基于Hadoop的数据仓库工具,在大数据处理和分析领域发挥着重要作用。通过提供类SQL的查询语言,Hive降低了数据处理的门槛,使得具有SQL背景的开发者可以轻松地处理大规模数据。然而,Hive也存在查询延迟高、表达能力有限等缺点,需要在实际应用中根据具体场景和需求进行选择和优化。