hive 底层模块实现-group by

转载 2017年01月18日 14:11:54

准备数据

SELECT uid, SUM(COUNT) FROM logs GROUP BY uid;
hive> SELECT * FROM logs;
a   苹果  5
a   橙子  3
a      苹果   2
b   烧鸡  1

hive> SELECT uid, SUM(COUNT) FROM logs GROUP BY uid;
a   10
b   1

计算过程

hive group by cal
默认设置了hive.map.aggr=true,所以会在mapper端先group by一次,最后再把结果merge起来,为了减少reducer处理的数据量。注意看explain的mode是不一样的。mapper是hash,reducer是mergepartial。如果把hive.map.aggr=false,那将groupby放到reducer才做,他的mode是complete.

Operator

hive group by op

Explain

hive> explain SELECT uid, sum(count) FROM logs group by uid;
OK
ABSTRACT SYNTAX TREE:
  (TOK_QUERY (TOK_FROM (TOK_TABREF (TOK_TABNAME logs))) (TOK_INSERT (TOK_DESTINATION (TOK_DIR TOK_TMP_FILE)) (TOK_SELECT (TOK_SELEXPR (TOK_TABLE_OR_COL uid)) (TOK_SELEXPR (TOK_FUNCTION sum (TOK_TABLE_OR_COL count)))) (TOK_GROUPBY (TOK_TABLE_OR_COL uid))))

STAGE DEPENDENCIES:
  Stage-1 is a root stage
  Stage-0 is a root stage

STAGE PLANS:
  Stage: Stage-1
    Map Reduce
      Alias -> Map Operator Tree:
        logs 
          TableScan // 扫描表
            alias: logs
            Select Operator //选择字段
              expressions:
                    expr: uid
                    type: string
                    expr: count
                    type: int
              outputColumnNames: uid, count
              Group By Operator //这里是因为默认设置了hive.map.aggr=true,会在mapper先做一次聚合,减少reduce需要处理的数据
                aggregations:
                      expr: sum(count) //聚集函数
                bucketGroup: false
                keys: //键
                      expr: uid
                      type: string
                mode: hash //hash方式,processHashAggr()
                outputColumnNames: _col0, _col1
                Reduce Output Operator //输出key,value给reducer
                  key expressions:
                        expr: _col0
                        type: string
                  sort order: +
                  Map-reduce partition columns:
                        expr: _col0
                        type: string
                  tag: -1
                  value expressions:
                        expr: _col1
                        type: bigint
      Reduce Operator Tree:
        Group By Operator

          aggregations:
                expr: sum(VALUE._col0)
//聚合
          bucketGroup: false
          keys:
                expr: KEY._col0
                type: string
          mode: mergepartial //合并值
          outputColumnNames: _col0, _col1
          Select Operator //选择字段
            expressions:
                  expr: _col0
                  type: string
                  expr: _col1
                  type: bigint
            outputColumnNames: _col0, _col1
            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

相关文章推荐

Hive – Group By 的实现 explain分析

准备数据 SELECT uid, SUM(COUNT) FROM logs GROUP BY uid; hive> SELECT * F...

Hive – Group By 的实现

准备数据 hive> SELECT * FROM logs; a 苹果 5 a 橙子 3 a 苹果 2 b 烧鸡 1 hive> SELECT uid, SUM(COUNT) FR...
  • jxlhc09
  • jxlhc09
  • 2013年12月25日 14:24
  • 638

HIVE UDAF和UDTF实现group by后获取top值

先自定义一个UDAF,由于udaf是多输入一条输出的聚合,所以结果拼成字符串输出,代码如下: public class Top4GroupBy extends UDAF {     //定义一个对...

hive使用技巧(三)——巧用group by实现去重统计

网站统计中常用的指标,pv ,uv , 独立IP,登录用户等,都涉及去重操作。全年的统计,PV超过100亿以上。即使是简单的去重统计也非常困...

hive 底层模块实现-join

准备数据语句SELECT a.uid,a.name,b.age FROM logs a JOIN users b ON (a.uid=b.uid);我们希望的结果是把users表join进来获取age...

hive 底层模块实现-distinct

准备数据语句SELECT COUNT, COUNT(DISTINCT uid) FROM logs GROUP BY COUNT; hive> SELECT * FROM logs; OK a 苹...

Hive_6. 数据聚合 -- Group By & Grouping_SETS & RollUp & CUBE & Having

先完善列表结构,会后续填充内容
  • Mike_H
  • Mike_H
  • 2015年12月03日 15:24
  • 1851

Hive.GROUP BY子句的“陷阱”

做SQL或类SQL查询工作,跟GROUP BY打交道太频繁了,使用人士应该都晓得:在SELECT子句中出现的字段或属性,如果不是在聚合函数中,那就必须要放到GROUP BY子句里面去,反过来,没有...

HIVE学习与实践(三):结合linux shell脚本按日期提取表,count,distinct,group by用法

例子下面的例子create_everyday.sh是在bash 脚本里面嵌入 hive的代码,实现在bash下 直接运行脚本 create_everyday.sh 20110101 201103...
  • dahunbi
  • dahunbi
  • 2016年11月16日 21:10
  • 174

Hive中distinct和Group by效率对比及处理方式

Hive中distinct和group by效率对比,及处理方式
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:hive 底层模块实现-group by
举报原因:
原因补充:

(最多只允许输入30个字)