Hive – Group By 的实现 explain分析

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

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

越复杂的查询通常会引入越多的stage,而stage越多就需要越多的时间时间来完成。

一个stage可以是一个Mapreduce任务,也可以是一个抽样阶段,或者一个合并阶段,还可以是一个limit阶段,以及Hive需要的其他某个任务的一个阶段。默认情况下,Hive会一次只执行一个stage,当然如果使用了并行执行,也可以同时执行几个stage

STAGE DEPENDENCIES:
  Stage-1 is a root stage
  Stage-0 is a root stage
​
-- 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
                aggregations:
                      expr: sum(id)            --group by Operator会应用到sum(id)
                bucketGroup: false
                mode: hash
                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
          outputColumnNames: _col0
          Select Operator
            expressions:
                  expr: _col0
                  type: bigint
            outputColumnNames: _col0
            File Output Operator              --在reducer中看到File Output Operator 中压缩为false
                                                说明输出结果不压缩
              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 ,因此是一个没有任何操作的阶段

理解Hive是如何对每个查询进行解析和计划的复杂的细节并非总是有用的。不过,这是分析复杂的或者执行效率低的查询的一个不错的方式,特别是当我们需要尝试各种各样的调优方式时,可以在逻辑层看到这些调整会产生什么样的影响,这样可以关联到性能的度量。

参考《hive编程指南》