hive 底层模块实现-distinct

转载 2017年01月18日 11:29:05

准备数据

语句

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

hive> SELECT COUNT, COUNT(DISTINCT uid) FROM logs GROUP BY COUNT;

根据count分组,计算独立用户数。

计算过程

hive distinct 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 distinct 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

转载:http://ju.outofmemory.cn/entry/784

相关文章推荐

Hive原理及查询优化

Hive是构建在Hadoop上的数据仓库软件框架,支持使用SQL来读,写和管理大规模数据集合。Hive入门非常简单,功能非常强大,所以非常流行。 通常来说,Hive只支持数据查询和加载,但后面的...
  • LW_GHY
  • LW_GHY
  • 2016年05月21日 12:24
  • 4546

大数据时代--Hive技术原理解析

本文旨在讲解Hive的运行原理,帮助使用者更好的了解在使用的过程中它做了些什么工作,深入的理解他的工作机制,提高开发人员理论层面的知识。后面会逐渐推出Hive使用、Hbase原理与使用等大数据专题类文...

Hive – Distinct 的实现

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

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 * FR...

hive语句优化-通过groupby实现distinct

同事写了个hive的sql语句,执行效率特别慢,跑了一个多小时程序只是map完了,reduce进行到20%。 该Hive语句如下: select count(distinct ip)  from ...

position:fixed;实现底层页面不跟随浮层模块滚动

由于工作需要,在首页做一个搜索浮层,要求浮层全屏显示(即:width:100%;height:100%;)。当页面内容超出屏幕高度时,页面添加滚动条(overflow:scroll;)。      ...

hive中select中DISTINCT的技巧和使用

以下是转载内容 单表的唯一查询用:distinct 多表的唯一查询用:group by 在使用MySQL时,有时需要查询出某个字段不重复的记录,虽然mysql提供有distinct这个关键字来过...

hive count distinct

select count(distinct user_id) from dm_user where ds=20150701; 使用disticnt函数,所有的数据只会shuffle到一个reducer...

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
  • 165
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:hive 底层模块实现-distinct
举报原因:
原因补充:

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