春雨惊春清谷天,夏满芒夏暑相连;秋处露秋寒霜降,冬雪雪冬小大寒。今天是2023年的最后一个节气:大雪。大雪节气之后,全国气温显著下降,北方冷空气越发活跃。大家注意防寒保暖
进入正题,本文主要对照Hive介绍Hive、Spark、Presto查询引擎中的增强GROUP BY
及相关语法,并通过多维场景案例分析详解三个引擎增强多维聚合语法之间的区别,以及使用中的一些常见问题
在多维分析场景下,我们可能会用到高阶聚合函数,例如GROUPING SETS
、CUBE
、ROLLUP
等。Hive、Spark、Presto等引擎都提供了类似的高阶聚合函数,以对不同维度组合下的数据进行聚合统计
Hive官方将这种分析称为GROUP BY
子句增强的聚合、多维数据集、分组和汇总
那么,什么是增强聚合和多维分析呢?
增强聚合是指在SQL中使用分组聚合查询时,使用GROUPING SETS
、CUBE
、ROLLUP
等子句进行操作。常见的查询引擎基本都支持这种语法,例如Hive、Spark、Presto、FlinkSQL等。使用增强聚合不仅可以简化SQL代码,而且还能提高SQL语句的性能
多维分析则是指多种维度组合的分析,而不是多种维度的分析。在多维分析场景下,可以还原任意维度组合下的维度列簇名称,以支持图表民主化的使用筛选器
多维分析主要用于多维度聚合,即多种维度组合并聚合结果
Hive官方对GROUPING SETS
的描述如下:
GROUP BY
中的GROUPING SETS
子句允许我们在同一记录集中指定多个GROUP BY
选项。所有GROUPING SET
子句都可以用由UNION
连接的多个GROUP BY
查询来逻辑表示
Hive官方文档:https://cwiki.apache.org/confluence/display/Hive/Enhanced+Aggregation%2C+Cube%2C+Grouping+and+Rollup
简单来说就是指定多组维度作为GROUP BY
的分组规则,然后再将结果联合在一起。它的效果等同于先分别对这些组维度进行GROUP BY
分组后,再通过UNION
将结果联合起来
例如,GROUPING SET
查询和等效的GROUP BY
查询如下:
-- 示例1:
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
-- 示例2:
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
-- 示例3:
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
-- 示例4:
SELECT a, b, SUM( c ) FROM tab1 GROUP BY a, b GROUPING SETS ( (a, b), a, b, ( ) )
-- 等效于
SELECT a