Hive explain执行计划详解

本文详细介绍了Hive的EXPLAIN命令,包括其使用语法和可选参数,如EXTENDED、DEPENDENCY等。通过示例展示了查询的执行计划,解释了Stage的依赖性和计划,以及MapReduce阶段的Map和Reduce操作,包括TableScan、Filter、Select、Map Join、Group By等Operator的工作原理,帮助理解Hive查询的底层原理和调优。
摘要由CSDN通过智能技术生成

Hive explain执行计划详解

 

HIVE提供了EXPLAIN命令来展示一个查询的执行计划,这个执行计划对于我们了解底层原理,hive 调优,排查数据倾斜等很有帮助

使用语法如下:

EXPLAIN [EXTENDED | DEPENDENCY | AUTHORIZATION | ANALYZE] query

explain 后面可以跟以下可选参数,注意:这几个可选参数不是 hive 每个版本都支持的

  1. EXTENDED:加上 extended 可以输出有关计划的额外信息。这通常是物理信息,例如文件名。这些额外信息对我们用处不大
  2. DEPENDENCY:dependency在EXPLAIN语句中使用会产生有关计划中输入的额外信息。它显示了输入的各种属性
  3. AUTHORIZATION:显示所有的实体需要被授权执行(如果存在)的查询和授权失败
  4. VECTORIZATION:将详细信息添加到EXPLAIN输出中,以显示为什么未对Map和Reduce进行矢量化。从 Hive 2.3.0 开始支持
  5. ANALYZE:用实际的行数注释计划。从 Hive 2.2.0 开始支持

在hive客户端执行如下语句

sql主要是 citizen 表与 city 表进行 join ,然后筛掉 city_name != " " 的数据,接着按照 city_name 进行分组,统计每个城市总人数大于 2 的城市
explain
SELECT 
city.city_name AS city_name,
COUNT(*) AS citizen_cnt 
FROM citizen 
JOIN city ON citizen.city_id = city.city_id 
WHERE city.city_name != '上海' 
GROUP BY city.city_name 
HAVING COUNT(*) >= 2 
ORDER BY city.city_name ASC 
LIMIT 2;

得到结果:

Explain
STAGE DEPENDENCIES:
  Stage-6 is a root stage
  Stage-2 depends on stages: Stage-6
  Stage-3 depends on stages: Stage-2
  Stage-0 depends on stages: Stage-3

STAGE PLANS:
  Stage: Stage-6
    Map Reduce Local Work
      Alias -> Map Local Tables:
        $hdt$_1:city 
          Fetch Operator
            limit: -1
      Alias -> Map Local Operator Tree:
        $hdt$_1:city 
          TableScan
            alias: city
            Statistics: Num rows: 3 Data size: 24 Basic stats: COMPLETE Column stats: NONE
            Filter Operator
              predicate: ((city_name <> '上海') and city_id is not null) (type: boolean)
              Statistics: Num rows: 3 Data size: 24 Basic stats: COMPLETE Column stats: NONE
              Select Operator
                expressions: city_id (type: int), city_name (type: string)
                outputColumnNames: _col0, _col1
                Statistics: Num rows: 3 Data size: 24 Basic stats: COMPLETE Column stats: NONE
                HashTable Sink Operator
                  keys:
                    0 _col0 (type: int)
                    1 _col0 (type: int)

  Stage: Stage-2
    Map Reduce
      Map Operator Tree:
          TableScan
            alias: citizen
            Statistics: Num rows: 9 Data size: 65 Basic stats: COMPLETE Column stats: NONE
            Filter Operator
              predicate: city_id is not null (type: boolean)
              Statistics: Num rows: 9 Data size: 65 Basic stats: COMPLETE Column stats: NONE
              Select Operator
                expressions: city_id (type: int)
                outputColumnNames: _col0
                Statistics: Num rows: 9 Data size: 65 Basic stats: COMPLETE Column stats: NONE
                Map Join Operator
                  condition map:
                       Inner Join 0 to 1
                  keys:
                    0 _col0 (type: int)
                    1 _col0 (type: int)
                  outputColumnNames: _col2
                  Statistics: Num rows: 9 Data size: 71 Basic stats: COMPLETE Column stats: NONE
                  Group By Operator
                    aggregations: count()
                    keys: _col2 (type: string)
                    mode: hash
                    outputColumnNames: _col0, _col1
                    Statistics: Num rows: 9 Data size: 71 Basic stats: COMPLETE Column stats: NONE
                    Reduce Output Operator
                      key expressions: _col0 (type: string)
                      sort order: +
                      Map-reduce partition columns: _col0 (type: string)
                      Statistics: Num rows: 9 Data size: 71 Basic stats: COMPLETE Column stats: NONE
                      value expressions: _col1 (type: bigint)
      Local Work:
        Map Reduce Local Work
      Reduce Operator Tree:
        Group By Operator
          aggregations: count(VALUE._col0)
          keys: KEY._col0 (type: string)
          mode: mergepartial
          outputColumnNames: _col0, _col1
          Statistics: Num rows: 4 Data size: 31 Basic stats: COMPLETE Column stats: NONE
          Filter Operator
            predicate: (_col1 >= 2) (type: boolean)
            Statistics: Num rows: 1 Data size: 7 Basic stats: COMPLETE Column stats: NONE
            File Output Operator
              compressed: false
              table:
                  input format: org.apache.hadoop.mapred.SequenceFileInputFormat
                  output format: org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat
                  serde: org.apache.hadoop.hive.serde2.lazybinary.LazyBinarySerDe

  Stage: Stage-3
    Map Reduce
      Map Operator Tree:
          TableScan
            Reduce Output Operator
              key expressions: _col0 (type: string)
              sort order: +
              Statistics: Num rows: 1 Data size: 7 Basic stats: COMPLETE Column stats: NONE
              TopN Hash Memory Usage: 0.1
              value expressions: _col1 (type: bigint)
      Reduce Operator Tree:
        Select Operator
          expressions: KEY.reducesinkkey0 (type: string), VALUE._col0 (type: bigint)
          outputColumnNames: _col0, _col1
          Statistics: Num rows: 1 Data size: 7 Basic stats: COMPLETE Column stats: NONE
          Limit
            Number of rows: 2
            Statistics: Num rows: 1 Data size: 7 Basic stats: COMPLETE Column stats: NONE
            File Output Operator
              compressed: false
              Statistics: Num rows: 1 Data size: 7 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: 2
      Processor Tree:
        ListSink

Time taken: 0.566 seconds, Fetched: 114 row(s)

一个HIVE查询被转换为一个由一个或多个stage组成的序列(有向无环图DAG)。这些stage可以是MapReduce stage,也可以是负责元数据存储的stage,也可以是负责文件系统的操作(比如移动和重命名)的stage

将上述结果拆分看,先从最外层开始,包含两个大的部分:

  1. stage dependencies: 各个stage之间的依赖性
  2. stage plan: 各个stage的执行计划

第一部分 stage dependencies ,包含四个 stage,Stage-6 是根stage,Stage-2 依赖 Stage-6,Stage-3 依赖 Stage-2,Stage-0 依赖 Stage-1,先执行Stage-6然后在执行Stage-2在执行Stage-3最后执行Stage-0。

第二部分 stage plan,

Stage: Stage-6是一个Map Reduce Local Work只有map的过程(在本地模式运行任务。对于小数据集,执行时间可以明显被缩短

Stage: Stage-2,Stage: Stage-3是两个完整的Map Reduce过程,里面包含

  1. Map Operator Tree: MAP端的执行计划树
  2. Reduce Operator Tree: Reduce端的执行计划树

这两个执行计划树里面包含这条sql语句的 operator:

  1. map端第一个操作肯定是加载表,所以就是 TableScan 表扫描操作
    • alias: 表名称
    • Statistics: 表统计信息,包含表中数据条数,数据大小等(条数不够精准,很多时候都显示只有1条,不知道是我操作有问题吗!!)
  2. Filter Operator:过滤操作
    • predicate:过滤条件,((city_name <> '上海') and city_id is not null) (type: boolean)),还会将去掉关联字段中为null的数据(仅限join
    • Statistics: 表统计信息,包含表中数据条数,数据大小等
  3. Select Operator: 选取操作
    • expressions:需要的字段名称及字段类型
    • outputColumnNames:输出的列名称
    • Statistics:表统计信息,包含表中数据条数,数据大小等
  4. Map Join Operator:join 操作
    • condition map:join方式 ,如Inner Join 0 to 1 Left Outer Join0 to 2
    • keys: join 的条件字段
    • outputColumnNames: join 完成之后输出的字段
    • Statistics: join 完成之后生成的数据条数,大小等
  5. Group By Operator:分组聚合操作
    • aggregations:显示聚合函数信息,如count(),sum(),agv()
    • keys:分组的字段,如果没有分组,则没有此字段
    • mode:聚合模式,值有 hash:随机聚合,就是hash partition;partial:局部聚合;final:最终聚合
    • outputColumnNames:聚合之后输出列名
    • Statistics: 表统计信息,包含分组聚合之后的数据条数,数据大小等
  6. Reduce Output Operator:输出到reduce操作,
    • key expressions: key字段名称及字段类型
    • sort order:值为空 不排序;值为 + 正序排序,值为 - 倒序排序;值为 +- 排序的列为两列,第一列为正序,第二列为倒序
    • Map-reduce partition columns: partition的列
    • Statistics:表统计信息,包含分组聚合之后的数据条数,数据大小等
    • value expressions: 结果字段名称及字段类型
  7. File Output Operator:文件输出操作
    • compressed:是否压缩
    • table:表的信息,包含输入输出文件格式化方式,序列化方式等
  8. Fetch Operator 客户端获取数据操作
    • limit,值为 -1 表示不限制条数,其他值为限制的条数

到此,整个sql的explain 查询结果就能一清二楚了,以后写sql都可以尝试通过explain来分析分析。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值