GROUPING SETS

该关键字可以实现同一数据集的多重group by操作。事实上GROUPING SETS是多个GROUP BY进行UNION ALL操作的简单表达,它仅仅使用一个stage完成这些操作。GROUPING SETS的子句中如果包含()数据集,则表示整体聚合。

Aggregate Query with GROUPING SETS

Equivalent Aggregate Query with GROUP BY

SELECT a, b, SUM( c ) FROM tab1 GROUP BY a, b GROUPING SETS ( (a, b), a, b, ( ) )

SELECT a, b, SUM( c ) FROM tab1 GROUP BY a, b

UNION

SELECT a, null, SUM( c ) FROM tab1 GROUP BY a, null

UNION

SELECT null, b, SUM( c ) FROM tab1 GROUP BY null, b

UNION

SELECT null, null, SUM( c ) FROM tab1

SELECT a, b, SUM( c ) FROM tab1 GROUP BY a, b GROUPING SETS ( (a,b), a)

SELECT a, b, SUM( c ) FROM tab1 GROUP BY a, b

UNION

SELECT a, null, SUM( c ) FROM tab1 GROUP BY a

SELECT a, b, SUM(c) FROM tab1 GROUP BY a, b GROUPING SETS ( (a,b) )

SELECT a, b, SUM(c) FROM tab1 GROUP BY a, b

SELECT a,b, SUM( c ) FROM tab1 GROUP BY a, b GROUPING SETS (a,b)

SELECT a, null, SUM( c ) FROM tab1 GROUP BY a

UNION

SELECT null, b, SUM( c ) FROM tab1 GROUP BY b

ROLLUP

扩展了GROUTING SETS。

其中count(d) 可以换成其他聚合函数例如:sum(d)

select a, b, c, count(d) from table group by a, b, c WITH ROLLUP;
// 等价于下面语句
select a, b, c from table group by a, b, c
GROUPING SETS((a,b,c),(a,b),(a),());

CUBE

扩展了GROUTING SETS,对各种条件进行聚合。

其中count(d) 可以换成其他聚合函数例如:sum(d)

select a, b, c,count(d)  from table group by a, b, c WITH ROLLUP;
// 等价于下面语句
select a, b, c from table group by a, b, c
GROUPING SETS((a,b,c),(a,b),(a,c),(b,c),(a),(b),(c),());

聚合条件 HAVING

having用于在组内进行过滤。

select cid,max(price) mx from orders group by cid having mx  > 1000;
//等价于下面的子查询语句
select t.cid, t.mx from (select cid, max(price) mx from orders group by cid) t
where t.mx > 1000;

Cubes and Rollups

The general syntax is WITH CUBE/ROLLUP. It is used with the GROUP BY only. CUBE creates a subtotal of all possible combinations of the set of column in its argument. Once we compute a CUBE on a set of dimension, we can get answer to all possible aggregation questions on those dimensions.It might be also worth mentioning here that
GROUP BY a, b, c WITH CUBE is equivalent to
GROUP BY a, b, c GROUPING SETS ( (a, b, c), (a, b), (b, c), (a, c), (a), (b), (c), ( )).ROLLUP clause is used with GROUP BY to compute the aggregate at the hierarchy levels of a dimension.
GROUP BY a, b, c with ROLLUP assumes that the hierarchy is "a" drilling down to "b" drilling down to "c".GROUP BY a, b, c, WITH ROLLUP is equivalent to GROUP BY a, b, c GROUPING SETS ( (a, b, c), (a, b), (a), ( )).

实例:

转载地址:

Hive分析窗口函数(五) GROUPING SETS,GROUPING__ID,CUBE,ROLLUP

GROUPING SETS,GROUPING__ID,CUBE,ROLLUP

这几个分析函数通常用于OLAP中,不能累加,而且需要根据不同维度上钻和下钻的指标统计,比如,分小时、天、月的UV数。

Hive版本为 apache-hive-0.13.1

数据准备:

    2015-03,2015-03-10,cookie12015-03,2015-03-10,cookie52015-03,2015-03-12,cookie72015-04,2015-04-12,cookie32015-04,2015-04-13,cookie22015-04,2015-04-13,cookie42015-04,2015-04-16,cookie42015-03,2015-03-10,cookie22015-03,2015-03-10,cookie32015-04,2015-04-12,cookie52015-04,2015-04-13,cookie62015-04,2015-04-15,cookie32015-04,2015-04-15,cookie22015-04,2015-04-16,cookie1CREATE EXTERNAL TABLE lxw1234 (month STRING,day STRING, cookieid STRING ) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' stored as textfile location '/tmp/lxw11/';hive> select * from lxw1234;OK2015-03 2015-03-10      cookie12015-03 2015-03-10      cookie52015-03 2015-03-12      cookie72015-04 2015-04-12      cookie32015-04 2015-04-13      cookie22015-04 2015-04-13      cookie42015-04 2015-04-16      cookie42015-03 2015-03-10      cookie22015-03 2015-03-10      cookie32015-04 2015-04-12      cookie52015-04 2015-04-13      cookie62015-04 2015-04-15      cookie32015-04 2015-04-15      cookie22015-04 2015-04-16      cookie1

GROUPING SETS

在一个GROUP BY查询中,根据不同的维度组合进行聚合,等价于将不同维度的GROUP BY结果集进行UNION ALL

    SELECT month,day,COUNT(DISTINCT cookieid) AS uv,GROUPING__ID FROM lxw1234 GROUP BY month,day GROUPING SETS (month,day) ORDER BY GROUPING__ID;month      day            uv      GROUPING__ID------------------------------------------------2015-03    NULL            5       12015-04    NULL            6       1NULL       2015-03-10      4       2NULL       2015-03-12      1       2NULL       2015-04-12      2       2NULL       2015-04-13      3       2NULL       2015-04-15      2       2NULL       2015-04-16      2       2等价于 SELECT month,NULL,COUNT(DISTINCT cookieid) AS uv,1 AS GROUPING__ID FROM lxw1234 GROUP BY month UNION ALL SELECT NULL,day,COUNT(DISTINCT cookieid) AS uv,2 AS GROUPING__ID FROM lxw1234 GROUP BY day

再如:

    SELECT month,day,COUNT(DISTINCT cookieid) AS uv,GROUPING__ID FROM lxw1234 GROUP BY month,day GROUPING SETS (month,day,(month,day)) ORDER BY GROUPING__ID;month         day             uv      GROUPING__ID------------------------------------------------2015-03       NULL            5       12015-04       NULL            6       1NULL          2015-03-10      4       2NULL          2015-03-12      1       2NULL          2015-04-12      2       2NULL          2015-04-13      3       2NULL          2015-04-15      2       2NULL          2015-04-16      2       22015-03       2015-03-10      4       32015-03       2015-03-12      1       32015-04       2015-04-12      2       32015-04       2015-04-13      3       32015-04       2015-04-15      2       32015-04       2015-04-16      2       3等价于SELECT month,NULL,COUNT(DISTINCT cookieid) AS uv,1 AS GROUPING__ID FROM lxw1234 GROUP BY month UNION ALL SELECT NULL,day,COUNT(DISTINCT cookieid) AS uv,2 AS GROUPING__ID FROM lxw1234 GROUP BY dayUNION ALL SELECT month,day,COUNT(DISTINCT cookieid) AS uv,3 AS GROUPING__ID FROM lxw1234 GROUP BY month,day

其中的 GROUPING__ID,表示结果属于哪一个分组集合。

CUBE

根据GROUP BY的维度的所有组合进行聚合。

    SELECT month,day,COUNT(DISTINCT cookieid) AS uv,GROUPING__ID FROM lxw1234 GROUP BY month,day WITH CUBE ORDER BY GROUPING__ID;month               day             uv     GROUPING__ID--------------------------------------------NULL            NULL            7       02015-03         NULL            5       12015-04         NULL            6       1NULL            2015-04-12      2       2NULL            2015-04-13      3       2NULL            2015-04-15      2       2NULL            2015-04-16      2       2NULL            2015-03-10      4       2NULL            2015-03-12      1       22015-03         2015-03-10      4       32015-03         2015-03-12      1       32015-04         2015-04-16      2       32015-04         2015-04-12      2       32015-04         2015-04-13      3       32015-04         2015-04-15      2       3等价于SELECT NULL,NULL,COUNT(DISTINCT cookieid) AS uv,0 AS GROUPING__ID FROM lxw1234UNION ALL SELECT month,NULL,COUNT(DISTINCT cookieid) AS uv,1 AS GROUPING__ID FROM lxw1234 GROUP BY month UNION ALL SELECT NULL,day,COUNT(DISTINCT cookieid) AS uv,2 AS GROUPING__ID FROM lxw1234 GROUP BY dayUNION ALL SELECT month,day,COUNT(DISTINCT cookieid) AS uv,3 AS GROUPING__ID FROM lxw1234 GROUP BY month,day

ROLLUP

是CUBE的子集,以最左侧的维度为主,从该维度进行层级聚合。

    比如,以month维度进行层级聚合:SELECT month,day,COUNT(DISTINCT cookieid) AS uv,GROUPING__ID  FROM lxw1234 GROUP BY month,dayWITH ROLLUP ORDER BY GROUPING__ID;month                 day             uv     GROUPING__ID---------------------------------------------------NULL             NULL            7       02015-03          NULL            5       12015-04          NULL            6       12015-03          2015-03-10      4       32015-03          2015-03-12      1       32015-04          2015-04-12      2       32015-04          2015-04-13      3       32015-04          2015-04-15      2       32015-04          2015-04-16      2       3可以实现这样的上钻过程:月天的UV->月的UV->总UV
    --把month和day调换顺序,则以day维度进行层级聚合:SELECT day,month,COUNT(DISTINCT cookieid) AS uv,GROUPING__ID  FROM lxw1234 GROUP BY day,month WITH ROLLUP ORDER BY GROUPING__ID;day                   month              uv     GROUPING__ID-------------------------------------------------------NULL            NULL               7       02015-04-13      NULL               3       12015-03-12      NULL               1       12015-04-15      NULL               2       12015-03-10      NULL               4       12015-04-16      NULL               2       12015-04-12      NULL               2       12015-04-12      2015-04            2       32015-03-10      2015-03            4       32015-03-12      2015-03            1       32015-04-13      2015-04            3       32015-04-15      2015-04            2       32015-04-16      2015-04            2       3可以实现这样的上钻过程:天月的UV->天的UV->总UV(这里,根据天和月进行聚合,和根据天聚合结果一样,因为有父子关系,如果是其他维度组合的话,就会不一样)

Grouping_ID函数

当我们没有统计某一列时,它的值显示为null,这可能与列本身就有null值冲突,这就需要一种方法区分是没有统计还是值本来就是null。(写一个排列组合的算法,就马上理解了,grouping_id其实就是所统计各列二进制和)

直接拿官方文档一个例子,O(∩_∩)O哈哈~

Column1 (key) Column2 (value)
1 NULL
1 1
2 2
3 3
3 NULL
4 5

hql统计:

  SELECT key, value, GROUPING__ID, count(*) from T1 GROUP BY key, value WITH ROLLUP

统计结果如下:

       
NULL NULL 0     00 6
1 NULL 1     10 2
1 NULL 3     11 1
1 1 3     11 1
2 NULL 1     10 1
2 2 3     11 1
3 NULL 1     10 2
3 NULL 3     11 1
3 3 3     11 1
4 NULL 1     10 1
4 5 3     11 1

GROUPING__ID转变为二进制,如果对应位上有值为null,说明这列本身值就是null。(通过类DataFilterNull.py 扫描,可以筛选过滤掉列中null、“”统计结果),

总结

cube的分组组合最全,是各个维度值的笛卡尔(包含null)组合,

rollup的各维度组合应满足,前一维度为null后一位维度必须为null,前一维度取非null时,下一维度随意,

grouping sets则为自定义维度,根据需要分组即可。

ps:通过grouping sets的使用可以简化SQL,比group by单维度进行union性能更好。

这种函数,需要结合实际场景和数据去使用和研究,只看说明的话,很难理解。

官网的介绍: https://cwiki.apache.org/confluence/display/Hive/Enhanced+Aggregation%2C+Cube%2C+Grouping+and+Rollup

转发:https://www.2cto.com/database/201708/671294.html

转发:https://blog.csdn.net/zhoudetiankong/article/details/52527142

参考:https://blog.csdn.net/suiyingli39/article/details/53540861

参考:https://blog.csdn.net/moon_yang_bj/article/details/17200367

依据上面两篇博客以及官网,整理

Hive分析窗口函数(五) GROUPING SETS,GROUPING__ID,CUBE,ROLLUP相关推荐

  1. Hive函数:GROUPING SETS,GROUPING__ID,CUBE,ROLLUP

    参考:lxw大数据田地:http://lxw1234.com/archives/2015/04/193.htm 数据准备: CREATE EXTERNAL TABLE test_data ( mont ...

  2. 大数据之hive:hive新功能之GROUPING SETS,Cube, Rollup

    目录 一.GROUPING SETS 1.概述 2.实战 二.Cube 1.概述 2.实战 三.Rollup 1.概述 2.实战 四.Grouping_ID函数 一.GROUPING SETS 1.概 ...

  3. Hive sql分组函数grouping sets、cube、rollup用法简介

    文章目录 1.数据如下: 2.建表如下: 3.grouping sets 4.cube 5.rollup 1.数据如下: user_id,dep_id,group_id,salary 10001,a, ...

  4. Hive分析窗口函数系列文章

    分析窗口函数应用场景: (1)用于分区排序 (2)动态Group By (3)Top N (4)累计计算 (5)层次查询 Hive分析窗口函数(一) SUM,AVG,MIN,MAX Hive中提供了越 ...

  5. Hive分析窗口函数

    分析窗口函数应用场景: (1)用于分区排序 (2)动态Group By (3)Top N (4)累计计算 (5)层次查询 Hive分析窗口函数(一) SUM,AVG,MIN,MAX Hive中提供了越 ...

  6. hive窗口函数分组排序并取第一个值_Hive(七)Hive分析窗口函数

    cookie1,2015-04-10,1 cookie1,2015-04-11,5 cookie1,2015-04-12,7 cookie1,2015-04-13,3 cookie1,2015-04- ...

  7. Hive学习(15)-Hive分析窗口函数(三)

    原文来自:扎心了,老铁的<Hive学习之路 (十五)Hive分析窗口函数(三) CUME_DIST和PERCENT_RANK>

  8. Hive分析窗口函数(一) SUM,AVG,MIN,MAX

    Hive分析窗口函数(一) SUM,AVG,MIN,MAX Hive分析窗口函数(一) SUM,AVG,MIN,MAX Hive中提供了越来越多的分析函数,用于完成负责的统计分析.抽时间将所有的分析窗 ...

  9. Hive 分析窗口函数

    窗口函数 窗口函数一般就是说over()函数,其窗口是由一个OVER字句定义的多行记录. 窗口函数有两种形式: over(distribute by 分区字段 sort by 排序字段) distri ...

最新文章

  1. 阿里秋招面试全解析(含内推岗)
  2. eclipse中配置SVN
  3. XTU 1243 2016
  4. 如何让手游内存占用更小?从内存消耗iOS实时统计开始
  5. php最大并发数,php内置开发服务器的最大并发连接数
  6. 基于PCL实现欧式聚类提取
  7. React 详解,组件,条件渲染
  8. 《Java技术》预备作业总结
  9. 对SQLite数据库操作 操作db文件
  10. ubuntu16安装Times New Roma字体 / WPS 安装Times New Roma字体
  11. Spring boot 项目中dcm文件转jpg文件
  12. word2007 计算机考试题库,2015年职称计算机考试题库word2007
  13. 10个炫酷特效的网页写法(附源码),拿去就能用,nice
  14. 公募基金资格:社保、养老金、企业年金,三者有什么区别?
  15. Nginx编译安装与虚拟主机配置
  16. 北航外国语学院计算机项目,北京航空航天大学外国语学院游学项目.pdf
  17. 零知识证明 - bellman源码分析
  18. xv6 6.S081 Lab3: alloc
  19. 彻底搞懂内存屏障(上)
  20. 计算机网络(二)Linux网络编程

热门文章

  1. 34tomcat设置默认页面
  2. java学习(87):Interage包装类进制转换
  3. asic面试题目 英伟达_免笔试!不限量!全球可编程图形处理技术领袖英伟达2021校园招聘火热进行中!...
  4. vue-cli 3.0集成sass/scss到vue项目
  5. glibc的头文件 linux_求助,编译glibc头文件时出错
  6. powerbuilder提示不是下拉窗口_为什么过去状态管理不是问题?
  7. 乔治敦大学计算机专业排名,2020USNEWS数据科学与分析专业综合排名(上)
  8. js保留两位小数的函数_使用率低但功能强大的6个Excel函数公式应用技巧解读!...
  9. React 在body上绑定事件以及阻止事件冒泡
  10. 2018 Multi-University Training Contest 1 Balanced Sequence(贪心)