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

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)
1NULL
11
22
33
3NULL
45

hql统计:

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

统计结果如下:

    
NULLNULL0     006
1NULL1     102
1NULL3     111
113     111
2NULL1     101
223     111
3NULL1     102
3NULL3     111
333     111
4NULL1     101
453     111

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/423481.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端学习(4):chome浏览器

一、认识浏览器 浏览器是网页显示、运行的平台,常用的浏览器有IE、火狐(Firefox)、谷歌(Chrome)、Safari和Opera等。我们平时称为五大浏览器。IE最新版为Edge。 常用浏览器 二、浏览器市场份额 可以通过百度的统计网…

JS的IE和Firefox兼容性总结

JS的IE和Firefox兼容性汇编(原作:hotman_x) 以下以 IE 代替 Internet Explorer,以 MF 代替 Mozzila Firefox 1. document.form.item 问题 (1)现有问题: 现有代码中存在许多 document.formName.item(&q…

spring----注解

以后想到了在写 1、DependsOn("xx") User bean被创建之前,先创建xx bean; DependsOn("xx") public class User{private int id; }转载于:https://www.cnblogs.com/yanxiaoge/p/11479628.html

Hive分析窗口函数 NTILE,ROW_NUMBER,RANK,DENSE_RANK

本文中介绍前几个序列函数,NTILE,ROW_NUMBER,RANK,DENSE_RANK,下面会一一解释各自的用途。Hive版本为 apache-hive-0.13.1 数据准备: cookie1,2015-04-10,1cookie1,2015-04-11,5cookie1,2015-04-12,7cookie1,2015-04-13,3cookie1,2015-04-14,…

前端学习(5):深入了解网站开发

要了解web前后端的区别,首先必须得清楚什么是web前端和web后端。 首先:web的本意是蜘蛛网和网的意思,在网页设计中我们称为网页的意思。现广泛译作网络、互联网等技术领域。表现为三种形式,即超文本(hypertext)、超媒体(hypermed…

实战 IE8 开发人员工具

今天整理我收藏的漫画的时候发现 风云3 少了两集(486、487),这对于收藏者来说基本是不可忍受的; 从风云一到三,应该一集也不能少的; 决定上网去找找,不过溜达一圈常去的分享论坛,由于…

spring----Bean的生命周期和循环依赖

循环依赖&#xff1a; A类引用了B&#xff0c;B类引用了A&#xff0c;像这种循环着依赖就是循环依赖&#xff1b; 对于这种配置不会报错 <bean id"instanceA" class"com.zy.entities.InstanceA"><property name"instanceB" ref"in…

SQL count和case when配合统计给定条件下不重复的记录数

Iamlaosong文 1、我们知道&#xff0c;SQL语句中用count函数统计记录数量&#xff0c;配合distinct关键字可以统计非重复的记录数量。例如&#xff1a; select count(*), count(city_name), count(distinct city_name) from tb_county 查询结果是&#xff1a; 2534 2534 …

前端学习(6):javascript简介

我们需要思考以下六个问题&#xff1a; 1、javaScript是什么&#xff1f; 2、javaScript的用途是什么&#xff1f; 3、javaScript和ECMAScript的关系是什么&#xff1f; 4、javaScript由哪几部分组成&#xff1f; 5、javaScript的执行原理是怎样的&#xff1f; 6、在页面…

提高系统性能

1.Cache缓存 对象有生命周期&#xff0c;有容量限制&#xff0c;适合保存有状态属性的对象。 有状态的session bean运行在EJB容器的Cache中 2.Pool池 对象池&#xff0c;实现对象的大量并行访问 无状态的session bean运行在EJB容器的Pool中。转载于:https://www.cnblogs.com/cx…

2019 徐州icpc网络赛 E. XKC's basketball team

题库链接&#xff1a; https://nanti.jisuanke.com/t/41387 题目大意 给定n个数&#xff0c;与一个数m&#xff0c;求ai右边最后一个至少比ai大m的数与这个数之间有多少个数 思路 对于每一个数&#xff0c;利用二分的方法求他右边大于等于aim的数的最后一个值。 关键在于怎么二…

Hive中COUNT的高级用法(条件过滤等)

在HIVE中&#xff0c;除了COUNT(*)外&#xff0c;COUNT还可以有很多高级用法。 SELECTtype, count(*), count(DISTINCT u), count(CASE WHEN plat1 THEN u ELSE NULL END), count(DISTINCT CASE WHEN plat1 THEN u ELSE NULL END), count(CASE WHEN (type2 OR type6) THEN u E…

前端学习(7):web的三大技术

HTML(5) 是一门标记型语言&#xff0c;主要由一些具备特殊含义的标签构成&#xff08;建筑物结构&#xff09; 所谓HTML是“超文本标记语言”的英文缩写。我们上网所看到网页&#xff0c;多数都是由HTML写成的。“超文本”是指页面内可以包含图片、链接&#xff0c;甚至音乐、…

SQL 关键字

Table B-1 列出了所由在 SQL 标准和 PostgreSQL 7.2 里是关键字的记号&#xff0e; 你可以在 Section 1.1.1 里找到 相关的背景信息&#xff0e; SQL 里有保留字(保留)和 非保留字之分&#xff0e;根据标准&#xff0c; 保留字是那些真正的关键字&#xff1b;我们决不能用它们…

scala的foreach和for

一句印象深刻的话&#xff0c;Alan Kay&#xff08;Smalltalk发明者&#xff09;说得一句话&#xff1a;“I’m not against types, but I dont know of any typesystems that arent a complete pain, so I still like dynamic typing”。 并不是静态类型不好&#xff0c;只是静…

Fedora7 安装完全过程

操作系统课要用Fedora7 安装配置真是一把辛酸泪呀..... 首先是找镜像文件&#xff08;这个就找了好久.....&#xff09;&#xff1a; https://archives.fedoraproject.org/pub/archive/fedora/linux/releases/7/Fedora/x86_64/iso/ 下载下来&#xff08;很久&#xff09;之后&a…

前端学习(8):HTML的基本属性和结构

一、HTML文档结构 <!DOCTYPE html> <html lang"zh-CN"> <head> <meta charset"UTF-8"> <title>css样式优先级</title> </head> <body> </body> </html> <!DOCTYPE html>声明为HTML5文…

Scala:Function1、Function2

Function1 带一个参数的方法&#xff0c;声明时&#xff0c;它需要两个泛型参数&#xff0c;第一个是传入的数据类型&#xff0c;第二个表示返回的数据类型&#xff0c;Function1是 trait &#xff0c;它有一个apply方法&#xff0c;用来对输入参数进行处理了&#xff0c;使用…

如何更sql sever数据库表的所有者

dbo不是表caseTable的所有者,就无法在查询分析器里执行各种sql语句,提示:服务器: 消息 208&#xff0c;级别 16&#xff0c;状态 1&#xff0c;行 1对象名 caseTable 无效。 表一般默认的所有者是dbo,现在有几个表不是的,所以无法用sa来连接,请问怎么改回为dbo呢? EXEC sp_c…

借助云开发轻松实现后台数据批量导出丨实战

小程序导出数据到excel表&#xff0c;借助云开发后台实现excel数据的保存 我们在开发小程序的过程中&#xff0c;可能会有这样的需求&#xff1a;如何将云数据库里的数据批量导出到excel表里&#xff1f; 这个需求可以用强大的云开发轻松实现&#xff01; 这里需要用到云函数&a…