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

【hive】cube和rollup函数的更多相关文章

  1. Oracle分组函数cube VS rollup

    分析函数cube和rollup魅力首先请看下面例子1)创建表create table group_test (group_id int, job varchar2(10), name varchar2 ...

  2. Oracle的聚合函数group by结合CUBE和ROLLUP的使用

    转自:https://docs.oracle.com/cd/E11882_01/server.112/e25554/aggreg.htm#DWHSG8618 CUBE Syntax CUBE appe ...

  3. [Hive_11] Hive 的高级聚合函数

    0. 说明 Hive 的高级聚合函数 union all | grouping sets | cube | rollup pv //page view 页面访问量 uv //user view 访问人 ...

  4. CUBE,ROLLUP 和 GROUPING

    1.用 CUBE 汇总数据 CUBE 运算符生成的结果集是多维数据集.多维数据集是事实数据的扩展,事实数据即记录个别事件的数据.扩展建立在用户打算分析的列上.这些列被称为维.多维数据集是一个结果集,其 ...

  5. Grouping Sets:CUBE和ROLLUP从句

    在上一篇文章里我讨论了SQL Server里Grouping Sets的功能.从文中的例子可以看到,通过简单定义需要的分组集是很容易进行各自分组.但如果像从所给的列集里想要有所有可能的分布——即所谓的 ...

  6. [SQL]详解CUBE和ROLLUP区别<使用rollup或cube通过交叉列可产生高级汇总结果集>

    要使用CUBE,首先要了解GROUP BY. 其实CUBE和ROLLUP区别不太大,只是在基于GROUP BY 子句创建和汇总分组的可能的组合上有一定差别,CUBE将返回的更多的可能组合.如果在GRO ...

  7. hive 调用java的函数和科学记数法转换

    hive中field如果是string,比如id,那么使用10000000000+id结果是科学计数法显示,转换为正常显示方法: select (10000000000+cast(id as int) ...

  8. 【SQL】面面俱到 | 在SQL中使用CUBE和ROLLUP实现数据多维汇总

    偶然在网上看到一篇文章,讲到数据汇总,提到了CUBE,感觉有些晦涩,想试着自己表述一下.同时,个人也认为CUBE还是很有用的,对SQL或数据分析感兴趣的小伙伴不妨了解一下,或许有用呢! 先设定个需求, ...

  9. [Hive_6] Hive 的内置函数应用

    0. 说明 Hive 的内置函数的基本操作 | 时间函数 | String 函数 | 条件语句 | explode | split | substring 1. 基本操作 查看函数 show func ...

随机推荐

  1. SLF4J其实只是一个门面服务而已,他并不是真正的日志框架,真正的日志的输出相关的实现还是要依赖Log4j、logback等日志框架的。

    小结: 1.加层: 每一种日志框架都有自己单独的API,要使用对应的框架就要使用其对应的API,这就大大的增加应用程序代码对于日志框架的耦合性. 为了解决这个问题,就是在日志框架和应用程序之间架设一个 ...

  2. Shape of passed values is (3490, 21), indices imply (3469, 21)

    背景 处理DataFrame数据时,抛了这个错误:Shape of passed values is (3490, 21), indices imply (3469, 21) 解决 数据出现重复,导致 ...

  3. scrapy-redis分布式爬虫

    简介 Scrapy-Redis则是一个基于Redis的Scrapy分布式组件.它利用Redis对用于爬取的请求(Requests)进行存储和调度(Schedule), 并对爬取产生的项目(items) ...

  4. 【抓包】火狐浏览器F12

    页面请求服务器的get.post两种请求,还有其他种,但是其他中基本不用,所以只记住get和post两种请求方法即可. 1.get(当前页面向服务器传值--即请求服务器)---弊端--传值长度有限 F ...

  5. AE读取CAD图层包括注记

    public override void FillDatabase(Teigha.DatabaseServices.Database pDb) { IFeatureClassContainer pFe ...

  6. OpenS-CAD学习(1)

    1.OpenS-CAD是一个不错的小巧的开源程序,以图层方式组织图形,可以绘制基本的线段.弧段.圆,可以进行节点对象捕捉,可以选择几何对象.对图幅进行平移.放大.缩小.可以将结果序列化保存为xml格式 ...

  7. onsubmit不起作用的原因

    使用form表单,添加onsubmit="return check()",来实现提交前进行相关验证功能时,有时会出现js函数不起作用的情况, 此时可以检查相应的js函数check( ...

  8. uva10537 dijkstra + 逆推

    21:49:45 2015-03-09 传送 http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8& ...

  9. 《高性能CUDA应用设计与开发》--笔记

    第一章 1.2 CUDA支持C与C++两种编程语言,该书中的实例采取的是Thrust数据并行API,.cu作为CUDA源代码文件,其中编译器为ncvv.   1.3 CUDA提供多种API: 数据并行 ...

  10. Python:执行精确的浮点数运算

    需要对浮点数执行精确的计算操作,并且不希望有任何小误差的出现. 浮点数的一个普遍问题是它们并不能精确的表示十进制数.并且,即使是最简单的数学运算也会产生小的误差,比如: >>> a ...