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函数相关推荐

  1. mysql中字符串处理替换字符replace和连接字符串函数concat

    一.替换字符函数replace mysql 替换字符串的实现方法: mysql中replace函数直接替换mysql数据库中某字段中的特定字符串,不再需要自己写函数去替换,用起来非常的方便. mysq ...

  2. mysql中的dateDayOfYear_Mysql 常用的时间日期及转换函数小结

    本文主要是总结一些常用的在实际运用中常用的一些mysql时间日期以及转换的函数 1.now()  :返回当前日期和时间 select now(); //2018-04-21 09:19:21 2.cu ...

  3. hdfs spark mysql环境_Mac上Hadoop, HDFS, Hive, Spark环境的安装和搭建

    安装前准备 jdk安装 java -version java version "1.8.0_181" Java(TM) SE Runtime Environment (build ...

  4. MySQL中如何定义一个自己写的函数

    文章目录 数据库中的函数 创建自定义函数 修改自定义函数 删除自定义的函数 在MySQL中存储着一系列的SQL语句,调用函数就是一次性执行这些语句.所以函数可以降低语句的重复. 但要注意到函数是注重返 ...

  5. MySQL中单句实现无限层次父子关系查询

    在 SQL Server 中,使用 CTE 表达式很容易做到无限层次父子关系查询:在不支持CTE表达式的版本中,借助函数递归也可以轻松实现. 在 MySQL 中,这个需求的实例稍显复杂, MySQL ...

  6. Mysql 中的日期时间函数汇总

    日期和时间函数 MySQL中内置了大量的日期和时间函数,能够灵活.方便地处理日期和时间数据,本节就简单介绍一下MySQL中内置的日期和时间函数. 1 CURDATE()函数 CURDATE()函数用于 ...

  7. MySQL中IF()、IFNULL()、NULLIF()、ISNULL()函数的使用

    在MySQL中可以使用IF().IFNULL().NULLIF().ISNULL()函数进行流程的控制. 1.IF()函数的使用 IF(expr1,expr2,expr3),如果expr1的值为tru ...

  8. mysql+中与当前时间比较大小_Mysql中时间加减和比较大小的方法

    在Oracle中使用时间函数to_date习惯了,在Oracle中时间的加减也非常简单,直接加减即可.在Mysql中时间的函数很多,非常自由. 在项目中经常用到的就是时间的加减. 比如60天前,Ora ...

  9. Hive cube,roll up入门案例

    cube hive中也有cube函数,可以实现多个任意维度的查询 cube(a,b,c)则首先会对(a,b,c)进行group by, 然后依次是(a,b),(a,c),(a),(b,c),(b),( ...

  10. 数据立方体-Hive Cube

    目录 1. 数据立方体 2. OLAP的基本操作 3. Hive Cube 3.1 with cube 3.2 with rollup 3.3 Grouping sets 3.4 grouping_i ...

最新文章

  1. numpy.random.rand使用详解
  2. artDialog组件应用学习(五)
  3. jvm调优:能生成的线程数
  4. java.lang.IllegalArgumentException: Must specify o
  5. SQL Server:关键字搜索
  6. 2021最新Java高频面试题,很适合大厂面试
  7. 在windows server 2003服务器上提供NTP时间同步服务
  8. 20200725每日一句
  9. Protel 99SE详细安装教程(附安装包)
  10. 软件测试功能测试全套常见面试题【功能测试-零基础】必备4-1
  11. ps ui html,【ps制作网页页面】ps图像如何生成html?如何将PS制作的网页效果图变成可用的网页?PC端UI设计尺寸规范?...
  12. JMeter - Non HTTP response code: java.net.BindException,Non HTTP response message: Address alrea...
  13. win配置pm2开机自启node项目
  14. Pycharm2020.1.1最新版安装教程
  15. 10.2.2.7 -DHCP 和 DNS 服务
  16. Flume简介及配置
  17. 动画对象(lv_anim_t)的应用
  18. 监控系统相关的常见面试问题
  19. lego-loam 跑 kitti00包(kitti2bag+lego-loam+evo)详细版
  20. 模拟器启动不起来怎么解决

热门文章

  1. html如何制作表格合并,html如何合并表格
  2. java实时推送goeasy_JAVA Web实时消息后台服务器推送技术---GoEasy
  3. arduino蓝牙模块1
  4. 【程序源代码】微信小程序开发视频(2021年最新版本)
  5. PSPnet预训练模型caffe model转pytorch
  6. SnowNLP自然语言处理模块具体用法
  7. 西铁城手表最外圈数字是什么_有的手表表盘外面有一圈数字,可以转动,是计算什么用的?...
  8. 裴礼文3.2.34解答
  9. excel 快速比对两列数据差异
  10. 面试求职:数据库常见面试题(数据库优化思路)