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 的实现

准备数据 SELECT uid, SUM(COUNT) FROM logs GROUP BY uid; hive> SELECT * FROM logs; a 苹果 5 ...
  • wisgood
  • wisgood
  • 2013年12月24日 16:58
  • 1450

Hive架构

Hive架构在Hadoop生态圈中已经是老生常谈。尽管如此,很多资料并没有将Hive模块之间的关系描述的十分清楚,本人也在管理Hive数据仓库时绕了不少弯路。所以我们仍要再谈Hive架构,希望将积累的...
  • yanshu2012
  • yanshu2012
  • 2017年02月09日 11:00
  • 1216

Hive几种数据导入方式

Hive常见的数据导入方式有4种: (1):从本地文件系统中导入数据到Hive表。 (2):从HDFS上导入数据到Hive表。 (3):从别的表中查询出相应的数据并导入到Hive表中。 (4):在创建...
  • lzm1340458776
  • lzm1340458776
  • 2015年01月26日 14:50
  • 588

hive 底层模块实现-join

准备数据语句SELECT a.uid,a.name,b.age FROM logs a JOIN users b ON (a.uid=b.uid);我们希望的结果是把users表join进来获取age...
  • u013660881
  • u013660881
  • 2017年01月18日 14:15
  • 161

hive 底层模块实现-distinct

准备数据语句SELECT COUNT, COUNT(DISTINCT uid) FROM logs GROUP BY COUNT; hive> SELECT * FROM logs; OK a 苹...
  • u013660881
  • u013660881
  • 2017年01月18日 11:29
  • 336

Hive(九)--两次group by的小例子

需求是这样的,原始数据第一列是用户的id,第二列是用户的行为,想按用户有过的行为点,对用户做聚合,并且统计各种行为组合的用户数量 比如下表 x1 y1 x1 y2 x2 y1 x2 y2...
  • yimingsilence
  • yimingsilence
  • 2017年04月06日 17:54
  • 1162

Hive group by操作

Hive中常见的高级查询有:group by、Order by、join、distribute by、sort by、cluster by、Union all。今天我们就来谈谈group by操作,g...
  • lzm1340458776
  • lzm1340458776
  • 2015年01月28日 15:50
  • 4323

hive group by distinct区别以及性能比较

Hive去重统计 相信使用Hive的人平时会经常用到去重统计之类的吧,但是好像平时很少关注这个去重的性能问题,但是当一个表的数据量非常大的时候,会发现一个简单的count(distinct order...
  • xiaoshunzi111
  • xiaoshunzi111
  • 2017年03月30日 10:57
  • 5369

Hive.GROUP BY子句的“陷阱”

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

Hive group by,in,not in

hive的group>http://stackoverflow.com/questions/5746687/hive-expression-not-in-group-by-key hive的in和no...
  • aaa1117a8w5s6d
  • aaa1117a8w5s6d
  • 2013年12月25日 16:58
  • 2836
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:hive 底层模块实现-group by
举报原因:
原因补充:

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