IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> hive grouping sets、with cube和with rollup的区别(详细分析,建议收藏) -> 正文阅读

[大数据]hive grouping sets、with cube和with rollup的区别(详细分析,建议收藏)

对于互联网公司报表需求中,有很多多维度的组合,大的汇总维度、小的明细维度,精细化的下钻。这样的背景下,我们很多的指标都要进行多维度的聚合。

grouping sets: 多维度组合,组合维度自定义
with cube: 多维度组合,程序自由组合,组合为各个维度的笛卡尔积
with rollup: with cube的子集,以左侧维度为主,即不允许左侧为NULL,右侧为非NULL的情况出现

我们来几个案例:

with cube:

spark-sql> with test1 as
         > (select '2021-08' as month_date,'2021-08-11' as day_date,10 as pv
         > union all
         > select '2021-08' as month_date,'2021-08-10' as day_date,15 as pv
         > union all
         > select '2021-08' as month_date,'2021-08-08' as day_date,35 as pv
         > union all
         > select '2021-07' as month_date,'2021-07-08' as day_date,35 as pv
         > union all
         > select '2021-07' as month_date,'2021-07-06' as day_date,25 as pv
         > union all
         > select '2021-07' as month_date,'2021-07-03' as day_date,15 as pv)
         > select 
         >   month_date,
         >   day_date,
         >   sum(pv) as pv
         > from test1
         > group by month_date,day_date
         > with cube
         > order by month_date,day_date;
NULL   		NULL    		135                                                             
NULL		2021-07-03		15
NULL		2021-07-06		25
NULL		2021-07-08		35
NULL		2021-08-08		35
NULL		2021-08-10		15
NULL		2021-08-11		10
2021-07		NULL			75
2021-07		2021-07-03		15
2021-07		2021-07-06		25
2021-07		2021-07-08		35
2021-08		NULL			60
2021-08		2021-08-08		35
2021-08		2021-08-10		15
2021-08		2021-08-11		10
Time taken: 26.605 seconds, Fetched 15 row(s)

grouping sets:

spark-sql> with test1 as
         > (select '2021-08' as month_date,'2021-08-11' as day_date,10 as pv
         > union all
         > select '2021-08' as month_date,'2021-08-10' as day_date,15 as pv
         > union all
         > select '2021-08' as month_date,'2021-08-08' as day_date,35 as pv
         > union all
         > select '2021-07' as month_date,'2021-07-08' as day_date,35 as pv
         > union all
         > select '2021-07' as month_date,'2021-07-06' as day_date,25 as pv
         > union all
         > select '2021-07' as month_date,'2021-07-03' as day_date,15 as pv)
         > select 
         >   month_date,
         >   day_date,
         >   sum(pv) as pv
         > from test1
         > group by month_date,day_date
         > grouping sets
         > (
         >  (),
         >  (month_date),
         >  (month_date,day_date),
         >  (day_date)
         > )
         > order by month_date,day_date;
NULL    	NULL    		135                                                             
NULL		2021-07-03		15
NULL		2021-07-06		25
NULL		2021-07-08		35
NULL		2021-08-08		35
NULL		2021-08-10		15
NULL		2021-08-11		10
2021-07		NULL			75
2021-07		2021-07-03		15
2021-07		2021-07-06		25
2021-07		2021-07-08		35
2021-08		NULL			60
2021-08		2021-08-08		35
2021-08		2021-08-10		15
2021-08		2021-08-11		10
Time taken: 12.854 seconds, Fetched 15 row(s)

总结:
从with cube和grouping sets的案例可以看出,两个结果是一样的。
with cube的维度组合就是groupingsets里面手动添加的维度,即为month_date,day_date两个维度的笛卡尔积。

我们再来看看 with rollup:

spark-sql> with test1 as
         > (select '2021-08' as month_date,'2021-08-11' as day_date,10 as pv
         > union all
         > select '2021-08' as month_date,'2021-08-10' as day_date,15 as pv
         > union all
         > select '2021-08' as month_date,'2021-08-08' as day_date,35 as pv
         > union all
         > select '2021-07' as month_date,'2021-07-08' as day_date,35 as pv
         > union all
         > select '2021-07' as month_date,'2021-07-06' as day_date,25 as pv
         > union all
         > select '2021-07' as month_date,'2021-07-03' as day_date,15 as pv)
         > select 
         >   month_date,
         >   day_date,
         >   sum(pv) as pv
         > from test1
         > group by month_date,day_date
         > with rollup
         > order by month_date,day_date;
NULL    	NULL    		135                                                             
2021-07		NULL			75
2021-07		2021-07-03		15
2021-07		2021-07-06		25
2021-07		2021-07-08		35
2021-08		NULL			60
2021-08		2021-08-08		35
2021-08		2021-08-10		15
2021-08		2021-08-11		10
Time taken: 18.792 seconds, Fetched 9 row(s)

总结:
从结果上可以看出,和with cube的区别是,少了day_date这个单独维度的聚合,因为with rollup是以左侧维度为主,当左侧month_date维度为NULL时,右侧day_date维度就不允许为NULL。

实际生产中,上一篇对grouping sets做了详细的分析,可以点击此处

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-08-13 12:07:06  更:2021-08-13 12:12:57 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 9:27:37-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码