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

nt下路由表的手工配置

 只要需要访问本网段之外的主机,就应该存在着一条路由信息,指引ip包的传送。所有的路由信息可以使用route print命令查看。如果网卡不是上Internet,应该不必为之配置默认网关,只需要手工加...
  • heyongzhou
  • heyongzhou
  • 2001-07-29 16:12:00
  • 1108

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

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

Hive进阶-深入解析Hive底层实现 - Distinct 的底层实现

转自Hive – Distinct 的实现 并稍作更改 http://ju.outofmemory.cn/entry/784 Hive版本为1.1.0。有空的话其实可以分析它在hive on...
  • zuolovefu
  • zuolovefu
  • 2018-01-10 16:40:41
  • 1494

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:41
  • 190

hive 底层模块实现-group by

准备数据SELECT uid, SUM(COUNT) FROM logs GROUP BY uid; hive> SELECT * FROM logs; a 苹果 5 a 橙子 3 a ...
  • u013660881
  • u013660881
  • 2017-01-18 14:11:54
  • 260

hive的order by语句分析

Hive中的order by跟传统的sql语言中的order by作用是一样的,会对查询的结果做一次全局排序,所以说,只有hive的sql中制定了order by所有的数据都会到同一个reducer进...
  • djd1234567
  • djd1234567
  • 2016-07-15 14:43:31
  • 792

Hive原理及查询优化

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

Hive原理

Point 1: 结构化数据:有具体的列和行,并且代表什么具体的含义,相当于一张表—mysql 非结构化数据:没有具体的行和列,完全没有规律——–nosqlPoint 2:什么是Hive? Hi...
  • ymf827311945
  • ymf827311945
  • 2017-05-19 18:43:47
  • 515

hive select查询语句底层实现的某些细微差别

最近,由于工作的需要,学习
  • kuangyuefeng
  • kuangyuefeng
  • 2014-06-18 10:45:10
  • 407

hive中select中DISTINCT的技巧和使用

以下是转载内容 单表的唯一查询用:distinct 多表的唯一查询用:group by 在使用MySQL时,有时需要查询出某个字段不重复的记录,虽然mysql提供有distinct这个关键字来过...
  • xiaoshunzi111
  • xiaoshunzi111
  • 2016-10-24 13:48:25
  • 12039
收藏助手
不良信息举报
您举报文章:hive 底层模块实现-distinct
举报原因:
原因补充:

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