翻译自 https://cwiki.apache.org/confluence/display/Hive/Enhanced+Aggregation%2C+Cube%2C+Grouping+and+Rollup
这篇文章是用来描述优化集合函数 group by 的, 这些函数是0.10版本以后才被添加进hive的,并且在0.11中做了优化。
GROUPING SETS clause (Grouping的用法)
GROUPING SETS子句中的GROUP BY允许我们在同一个记录集指定多个group by。
所有的分组集子句在逻辑上可以表现为多个GROUP BY的UNION连接查询。Table-1 显示了几个等价语句,这可以帮助你形成grouping by 的概念。在grouping by中的空白set(),指的是全集。
Table 1
Grouping Set
|
等价于
|
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), 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, null, SUM( c ) FROM tab1 GROUP BY a
UNION
SELECT null, b, SUM( c ) FROM tab1 GROUP BY b
|
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
|
Grouping__ID function (Grouping__ID函数)
当需要被聚合的 列的值为null时,可能会因为null而发生冲突。
这里就需要一些方法来识别null值,Grouping__ID 函数就是用来解决这个的。
这个函数对于每一列返回一个位向量,对于每一列,如果该行被聚合了就产生"1",否则为"0",这可以用来区分数据中有没有null.
看下面的例子
表 2.1
column1 (key)
|
column2 (value)
|
1
|
NULL
|
1
|
1
|
2
|
2
|
3
|
3
|
3
|
NULL
|
4
|
5
|
跑这个SQL会有下面的结果
SELECT key, value, GROUPING__ID, count(*) from T1 GROUP BY key, value WITH ROLLUP
表 2.2
NULL
|
NULL
|
0
|
6
|
1
|
NULL
|
1
|
2
|
1
|
NULL
|
3
|
1
|
1
|
1
|
3
|
1
|
2
|
NULL
|
1
|
1
|
2
|
2
|
3
|
1
|
3
|
NULL
|
1
|
2
|
3
|
NULL
|
3
|
1
|
3
|
3
|
3
|
1
|
4
|
NULL
|
1
|
1
|
4
|
5
|
3
|
1
|
请注意,第三列是被选中的列的位向量。
对于第一行,没有列被选中。
对于第二行中,只有第一列被选择,这可以解释为2的计数。
对于在第三行,无论列被选中(第二列恰好是空值),这可以解释为1的计数。
------还是解释下上面的东西
根据上面的GROUP__ID 分应该有4种情况
key
|
value
|
Group__ID
|
|
NULL(谁也不选中)
|
NULL(谁也不选中)
|
0(第一种情况)
|
|
任意值(选择任意一个)
|
NULL(谁也不选中)
|
1(第二种情况)
|
|
NULL(谁也不选中)
|
任意值(选择任意一个)
|
2(第三种情况)
|
|
任意值(选择任意一个)
|
任意值(选择任意一个)
|
3(第四种情况)
|
|
再来看 表2.2
第一种情况 谁也不选中 Group__ID=0 一共六行都可以谁也不选中,所以 count=6
第二种情况 key任意值,而value 谁也不选 Group__ID=1 一共有4种情况
1
|
NULL
|
2
|
NULL
|
3
|
NULL
|
4
|
NULL
|
所以也就有了表2.2中的第二行,第五行,第七行,第10行,
具体解释下 第二行为什么count=2 是因为 1个不选(派生出来的),另外一个是本来就是NULL,同理也就解释了为什么 Group__ID=0为什么是6 而不是12,
同样的第五行 count=1 是因为 一行是派生出来,没有key=2 value=null 的列 所以count=1
第七行又是第二行的情况 所以count=2
第十行就不累述
第三种情况Group__ID=2 由于key没有不被选择的所以一个也没有
第四种情况大家都是任意被选中 Group__ID=3
当key=1时
有2个
所以coun=1 表2.2的 第三,第四行
key=2时
所以count=1 表2.2的第六行
key=3时
表2.2的第八,第九行
等等
相关推荐
3. **Advanced Monitoring Capabilities:** Enhanced monitoring tools and notifications to help administrators quickly identify and resolve issues. **Known Problems Fixed in This Version:** This version...
在IT领域,特别是企业级应用集成与管理方面,"Enhanced Centralized Monitoring and Administration"这一主题探讨了如何通过中央监控和管理策略优化SAP NetWeaver Process Integration (PI) 7.1系统的运行效率和成本...
### IEEE SAE and Enhanced Packet Core #### 背景与目标 随着移动互联网技术的不断发展,第四代(4G)长期演进(Long Term Evolution, LTE)网络的需求日益凸显。在2005年左右,3GPP RAN小组启动了LTE的工作,...
Eclipse Enhanced Class Decompiler 3.1.1是一款专为Eclipse集成开发环境设计的反编译插件,旨在帮助开发者查看和理解Java字节码,将编译后的.class文件还原成可读性较高的源代码形式。这款插件极大地提升了开发者在...
《深入理解Eclipse反编译插件:Enhanced Class Decompiler 3.1.1》 在编程领域,源代码是理解软件工作原理的关键。然而,有时我们可能面对的是只包含字节码的.class文件,这时就需要反编译工具来帮助我们将字节码...
"enhanced-class-decompiler.zip" 是一个专为Eclipse集成开发环境设计的反编译插件,它能够帮助开发者在无法获取源码时对.class文件进行反编译,从而查看并理解字节码的逻辑,进而进行调试工作。 首先,我们要了解...
Enhanced_Hierarchy_2.0_v2.4.5.unitypackage 最新版本哦 正版
NetDisturb_Enhanced_V4.9 是一个网络仿真软件的增强版本,专注于提供高度精确和全面的网络行为模拟。在网络工程、网络安全研究以及网络性能分析等领域,这样的工具至关重要。它允许用户在不实际部署的情况下预测和...
ZnxCd1-xS/TiO2 异质纤维制备及其光催化性能,杨国锐,延卫,本文通过静电纺丝和水热法连用成功制备了ZnxCd1-xS/TiO2纳米纤维。利用x射线粉末衍射(XRD)、场发射扫描电镜(SEM)、紫外可见漫反射仪
In this paper, we utilize both large-scale textual corpora and KGs to train an enhanced language representation model (ERNIE), which can take full advantage of lexical, syntactic, and knowledge ...
《Windows Enhanced Storage:智能存储的未来》 Windows Enhanced Storage(增强型存储)是微软公司推出的一项创新技术,旨在为用户提供无缝且安全的智能存储体验。它是一个平台,旨在促进存储设备的价值增值,使得...
Enhanced Class Decompiler是Eclipse\的插件。它将JD、JAD、Fernflower、CFR和Procyon与Eclipse IDE无缝集成。它在调试过程中显示所有Java源代码,即使您没有所有这些Java源代码。您可以直接调试这些类文件而不需要...
这份手册,以“php_enhanced_zh.rar”为压缩包名称,暗示了其增强版的特性,针对中文用户进行了优化,便于国内开发者理解和使用。在标签中,“enhanced_php”,“php_enhanced_zh”,“php-enhanced”,...
DirectX Repair V3.9 (Enhanced Edition) 是一个专门设计用于修复系统中与DirectX相关的错误和问题的工具。DirectX是由微软开发的一组应用程序接口(APIs),主要用于处理多媒体任务,包括游戏图形、音频处理和视频...
沙猫优化算法(Sand Cat Swarm Optimization,简称SCSO)是一种基于群智能的优化算法,源自于生物界中沙猫的行为模式。沙猫在沙漠中寻找猎物的方式启发了这种算法的设计,它通过模拟沙猫在复杂环境中的搜索策略来...
V3.5 (Enhanced Edition)是该软件的一个增强版本,相比之前的版本,它可能包含更多的修复功能、优化了修复过程或者提高了修复成功率。开发者通常会发布更新来修复已知的bug,增强软件的稳定性和兼容性,同时可能还会...
这个插件的主要目的是提升Unity内置控制台的功能,为开发者提供更强大的调试工具,以优化开发过程并提高工作效率。下面将详细介绍Unity、Unity控制台以及Console Enhanced Pro 3.2.1的功能和重要性。 Unity是一款跨...
"mybatis-enhanced-cache"正是针对MyBatis的一个缓存增强插件,它的出现是为了提供更细粒度的缓存控制,帮助开发者更好地管理和优化应用性能。 首先,让我们了解缓存的基本概念。在MyBatis中,缓存分为一级缓存...
as well as an Enhanced CommandField to allow for a filter button, resolve image button double postbacks, and enable some of the Enhanced GridView's capabilities. Additionally, provides "safe" ...