hive explain详解

HiveQL是一种声明式语言,用户会提交声明式的查询,而Hive会将其转换为MapReduce Job。大多数情况下,用户不需要了解Hive 内部是如何工作的,不过,当用户对于hive具有越来越多的经验后,学习下Hive背后的理论知识以及底层的一些实现细节,会让用户更加高效地使用Hive。

要了解HIVE是如何工作的,第一个步骤就是了解EXPLAIN的功能,它能帮助我们学习hive如何将查询转化成MapReduce任务的。

第一步,解读抽象语法树

hive >explain extended select sum(id) from my;
OK
ABSTRACT SYNTAX TREE:
  (TOK_QUERY 
     (TOK_FROM (TOK_TABREF (TOK_TABNAME my))) 
     (TOK_INSERT (TOK_DESTINATION (TOK_DIR TOK_TMP_FILE)) 
     (TOK_SELECT 
        (TOK_SELEXPR 
          (TOK_FUNCTION sum (TOK_TABLE_OR_COL id))))))

这里为了更好地展示,对实际的输出信息进行了缩进处理。
如何解读: 忽略掉TOK_这个关键字来解读,我们可以分别知道以下几个关键的地方

a1. FROM......TABNAME my
a2. INSERT....DIR TMP_FILE
      (我们的查询会最终显示到控制台,但在显示到控制台之前,hive会将输出写入到一个临时文件中)
a3. SELECT sum (id)

第二步,解读stage

一个Hive任务会包含一个或多个stage(阶段),不同的stage间会存在着依赖关系。
越复杂的查询通常会引入越多的stage,而stage越多就需要越多的时间时间来完成。

一个stage可以是一个Mapreduce任务,也可以是一个抽样阶段,或者一个合并阶段,还可以是一个limit阶段,以及Hive需要的其他某个任务的一个阶段。默认情况下,Hive会一次只执行一个stage,当然如果使用了并行执行,也可以同时执行几个stage,extended关键字可以更加详细的列举出代码的执行过程。

EXPLAIN [EXTENDED|DEPENDENCY|AUTHORIZATION] query

执行计划计划的不同阶段之间的依赖关系
STAGE DEPENDENCIES:
Stage-1 is a root stage                       -- 阶段1
Stage-0 depends on stages: Stage-1            -- 结束阶段,依赖阶段1
STAGE PLAN部分比较冗长也比较复杂

STAGE PLANS:
  Stage: Stage-1 (包含了这个job的大部分处理过程,而且会触发一个 Mapreduce job)
    Map Reduce                                 --发生在job的map处理阶段过程
      Alias -> Map Operator Tree:
        my 
          TableScan                            --TableScan以my表作为输入
            alias: my
            Select Operator
              expressions:
                    expr: id                   --产生只有一个id的输出
                    type: int
              outputColumnNames: id            -- 临时字段
              Group By Operator   --//这里是因为默认设置了hive.map.aggr=true,会在mapper先做一次聚合,减少reduce需要处理的数据
                aggregations:
                      expr: sum(id)            --group by Operator会应用到sum(id)
                bucketGroup: false
                mode: hash 			//hash方式,processHashAggr() 	                outputColumnNames: _col0       --产生一个输出字段_col0,它是临时结果字段按规则起的临时字段名
                Reduce Output Operator
                  sort order: 
                  tag: -1
                  value expressions:
                        expr: _col0
                        type: bigint
      Reduce Operator Tree:                    --reduce过程 
        Group By Operator
          aggregations:
          		expr: sum(VALUE._col0)         --对_col0字段进行sum操作
          bucketGroup: false
          mode: mergepartial  //因为设置了hive.map.aggr=true,先在map端做group by所以这里的模式为mergepartial(部分聚合值),如果hive.map.aggr=false,则会变成complete(完整的聚合值),相对来说效率就很低了
          outputColumnNames: _col0
          Select Operator
            expressions:
                  expr: _col0
                  type: bigint
            outputColumnNames: _col0
            File Output Operator              --在reducer中可以看到File Output Operator,说明输出结果将是文本格式
              compressed: false
              GlobalTableId: 0
              table:
                  input format: org.apache.hadoop.mapred.TextInputFormat
                  output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat                                 ---说明输出结果将是文本格式,基于字符串的输出格式

  Stage: Stage-0
    Fetch Operator
      limit: -1                              --job没有limit ,因此 stage-0 是一个没有任何操作的阶段
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雾岛与鲸

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值