mysql中的cube和rollup_【hive】cube和rollup函数
cube
数据立方体(Data Cube),是多维模型的一个形象的说法.(关于多维模型这里不讲述,在数据仓库设计过程中还挺重要的,有兴趣自行查阅)
立方体其本身只有三维,但多维模型不仅限于三维模型,可以组合更多的维度
为什么叫数据立方体?
一方面是出于更方便地解释和描述,同时也是给思维成像和想象的空间;
另一方面是为了与传统关系型数据库的二维表区别开来
下图为数据立方体的形象图
其实并不用把cube理解得很高大上,只要理解为分别按照不同维度进行聚合.
hive中也有cube函数,可以实现多个任意维度的查询
cube(a,b,c)则首先会对(a,b,c)进行group by,
然后依次是(a,b),(a,c),(a),(b,c),(b),(c),最后在对全表进行group by,他会统计所选列中值的所有组合的聚合
用cube函数就可以完成所有维度的聚合工作.
语法
select col1,col2,col3,col4, --维度字段
count(user_id), --聚合字段
GROUPING__ID, --聚合选取的组号(二进制表示,但是这里打印出来的是十进制)
rpad(reverse(bin(cast(GROUPING__ID AS bigint))),4,'0') --对其二进制化就能明白了,注意中间是两个下划线,因为在反转的时候会把末尾的0去掉,需要用rpad补充至维度个数
from table
group by col1,col2,col3,col4 --维度字段都要出现在group by中,这里不能使用1,2,3,4代替
with cube; --使用cube函数
如果我们想要手动实现cube函数就需要把所有维度的聚合都用union all来汇总.
可以说cube函数方便了用户的使用.
但是我并不用知道所有维度的聚合,我就想要col1,(col2,col3)的怎么办?
grouping sets
当不需要cube将所有维度都列出来的时候,当只需要部分维度的时候
可以使用grouping sets来进行决定聚合那些维度
语法
select col1,col2,col3, --维度字段
count(user_id), --聚合字段
GROUPING__ID, --聚合选取的组号(二进制表示,但是这里打印出来的是十进制)
rpad(reverse(bin(cast(GROUPING__ID AS bigint))),3,'0') --对其二进制化就能明白了,注意中间是两个下划线,注意中间是两个下划线,因为在反转的时候会把末尾的0去掉,需要用rpad补充至维度个数
from table
group by col1,col2,col3 --维度字段都要出现在group by中,并不能省略暂时不用到的字段,这里不能使用1,2,3,4代替
grouping sets(col1,(col2,col3)); --使用grouping sets来代替with cube
注意:当使用grouping sets()进行指定维度聚合的时候,仅仅聚合你给出的维度组合,并不会自动帮你组合维度.
例如 grouping sets(col1,(col2,col3)) 只聚合col1维度,(col2,col3)维度.
并不会自动聚合(col1,col2,col3)维度
rollup
rullup函数是cube的子集,以最左侧维度为主,按照顺序依次进行聚合.
例如聚合的维度为 col1,col2,col3 使用rollup聚合的字段分别为 col1,(col1,col2),(col1,col3),(col1,col2,col3)
语法
select col1,col2,col3,col4, --维度字段
count(user_id), --聚合字段
GROUPING__ID, --聚合选取的组号(二进制表示,但是这里打印出来的是十进制)
rpad(reverse(bin(cast(GROUPING__ID AS bigint))),4,'0') --对其二进制化就能明白了,注意中间是两个下划线,注意中间是两个下划线,因为在反转的时候会把末尾的0去掉,需要用rpad补充至维度个数
from table
group by col1,col2,col3,col4 --维度字段都要出现在group by中,这里不能使用1,2,3,4代替
with rollup; --使用rollup函数
如何查看根据什么维度聚合呢?
select user_type,sales, --维度
count(user_id) as pv, --聚合字段
grouping__id,
rpad(reverse(bin(cast(GROUPING__ID AS bigint))),2,'0') as sign --grouping__id逆序
from user_info
group by user_type,sales
with cube;
查询结果如下
user_type
sales
pv
grouping__id
sign
NULL
NULL
10
0
00
old
NULL
3
1
10
new
NULL
7
1
10
old
3
1
3
11
old
2
1
3
11
old
1
1
3
11
new
6
1
3
11
new
5
2
3
11
new
3
1
3
11
new
2
1
3
11
new
1
2
3 .
11
上面是使用cube函数聚合后的数据
可以根据 GROUPING__ID 的二进制表示形式(反向)直接看出.
这里使用聚合的维度有user_type和sales两个维度,如果使用当前维度,对应bin(grouping__id)数字为1
例如 第二行数据的 10 -> 使用了user_type维度,没使用sales
可以通过聚合后的数据看出
当改字段为NULL的时候,说明没有使用该字段维度.
例如 第二行数据 old NULL -> 使用了user_type维度,没使用sales
mysql中的cube和rollup_【hive】cube和rollup函数相关推荐
- mysql中字符串处理替换字符replace和连接字符串函数concat
一.替换字符函数replace mysql 替换字符串的实现方法: mysql中replace函数直接替换mysql数据库中某字段中的特定字符串,不再需要自己写函数去替换,用起来非常的方便. mysq ...
- mysql中的dateDayOfYear_Mysql 常用的时间日期及转换函数小结
本文主要是总结一些常用的在实际运用中常用的一些mysql时间日期以及转换的函数 1.now() :返回当前日期和时间 select now(); //2018-04-21 09:19:21 2.cu ...
- hdfs spark mysql环境_Mac上Hadoop, HDFS, Hive, Spark环境的安装和搭建
安装前准备 jdk安装 java -version java version "1.8.0_181" Java(TM) SE Runtime Environment (build ...
- MySQL中如何定义一个自己写的函数
文章目录 数据库中的函数 创建自定义函数 修改自定义函数 删除自定义的函数 在MySQL中存储着一系列的SQL语句,调用函数就是一次性执行这些语句.所以函数可以降低语句的重复. 但要注意到函数是注重返 ...
- MySQL中单句实现无限层次父子关系查询
在 SQL Server 中,使用 CTE 表达式很容易做到无限层次父子关系查询:在不支持CTE表达式的版本中,借助函数递归也可以轻松实现. 在 MySQL 中,这个需求的实例稍显复杂, MySQL ...
- Mysql 中的日期时间函数汇总
日期和时间函数 MySQL中内置了大量的日期和时间函数,能够灵活.方便地处理日期和时间数据,本节就简单介绍一下MySQL中内置的日期和时间函数. 1 CURDATE()函数 CURDATE()函数用于 ...
- MySQL中IF()、IFNULL()、NULLIF()、ISNULL()函数的使用
在MySQL中可以使用IF().IFNULL().NULLIF().ISNULL()函数进行流程的控制. 1.IF()函数的使用 IF(expr1,expr2,expr3),如果expr1的值为tru ...
- mysql+中与当前时间比较大小_Mysql中时间加减和比较大小的方法
在Oracle中使用时间函数to_date习惯了,在Oracle中时间的加减也非常简单,直接加减即可.在Mysql中时间的函数很多,非常自由. 在项目中经常用到的就是时间的加减. 比如60天前,Ora ...
- Hive cube,roll up入门案例
cube hive中也有cube函数,可以实现多个任意维度的查询 cube(a,b,c)则首先会对(a,b,c)进行group by, 然后依次是(a,b),(a,c),(a),(b,c),(b),( ...
- 数据立方体-Hive Cube
目录 1. 数据立方体 2. OLAP的基本操作 3. Hive Cube 3.1 with cube 3.2 with rollup 3.3 Grouping sets 3.4 grouping_i ...
最新文章
- numpy.random.rand使用详解
- artDialog组件应用学习(五)
- jvm调优:能生成的线程数
- java.lang.IllegalArgumentException: Must specify o
- SQL Server:关键字搜索
- 2021最新Java高频面试题,很适合大厂面试
- 在windows server 2003服务器上提供NTP时间同步服务
- 20200725每日一句
- Protel 99SE详细安装教程(附安装包)
- 软件测试功能测试全套常见面试题【功能测试-零基础】必备4-1
- ps ui html,【ps制作网页页面】ps图像如何生成html?如何将PS制作的网页效果图变成可用的网页?PC端UI设计尺寸规范?...
- JMeter - Non HTTP response code: java.net.BindException,Non HTTP response message: Address alrea...
- win配置pm2开机自启node项目
- Pycharm2020.1.1最新版安装教程
- 10.2.2.7 -DHCP 和 DNS 服务
- Flume简介及配置
- 动画对象(lv_anim_t)的应用
- 监控系统相关的常见面试问题
- lego-loam 跑 kitti00包(kitti2bag+lego-loam+evo)详细版
- 模拟器启动不起来怎么解决
热门文章
- html如何制作表格合并,html如何合并表格
- java实时推送goeasy_JAVA Web实时消息后台服务器推送技术---GoEasy
- arduino蓝牙模块1
- 【程序源代码】微信小程序开发视频(2021年最新版本)
- PSPnet预训练模型caffe model转pytorch
- SnowNLP自然语言处理模块具体用法
- 西铁城手表最外圈数字是什么_有的手表表盘外面有一圈数字,可以转动,是计算什么用的?...
- 裴礼文3.2.34解答
- excel 快速比对两列数据差异
- 面试求职:数据库常见面试题(数据库优化思路)