Spark SQL 使用 GROUPING SETS 替代 UNION ALL

介绍

一组数据DataSet,有多个维度A,B,我们需要对这组数据进行一下聚合:

  • 全量数据的Min,Max,Avg
  • 按维度A聚合,计算 Min,Max,Avg
  • 按维度B聚合,计算 Min,Max,Avg
  • 按维度AB聚合,计算 Min,Max,Avg

实现这个需求的直觉是根据不同的维度分别聚合计算出Min,Max,Avg结果,然后再用UNION ALL把所有结果连接起来:

-- 全量数据的Min,Max,Avg
SELECT
NULL, 
NULL,
Min,
Max,
Avg
from
DataSet

UNION ALL 
-- 按维度A聚合,计算 Min,Max,Avg
SELECT 
A,
NUll,
Min,
Max,
Avg
from
DataSet
GROUP BY 
A

UNION ALL 
-- 按维度B聚合,计算 Min,Max,Avg
SELECT 
NULL,
B,
Min,
Max,
Avg
from
DataSet
GROUP BY 
B 

UNION ALL 
--按维度AB聚合,计算 Min,Max,Avg
SELECT 
A,
B,
Min,
Max,
Avg
from
DataSet
GROUP BY 
A,
B

这种方式能达到效果,但是实现起来比较繁琐,如果维度比较多,就要一长串的SQL代码。
那么有没有比较简单且优雅的实现方式呢?
使用 GROUPING SETS 替代

SELECT 
A,
B,
Min,
Max,
Avg
from
DataSet
GROUP BY 
A,
B
GROUPING SETS(
        (A),
        (B),
        (A,B),
        ()
    )

这个写法也太简洁了吧!!

当数据集中有多个维度,并且需要实现维度的多组合聚合, 使用GROUPING SETS可以完美解决

使用案例

有一组薪酬明细数据,维度有部门,职级,需要计算一下结果:

  • 全年级成绩的Min,Max,Avg
  • 班级成绩的Min,Max,Avg
  • 课程成绩的Min,Max,Avg
  • 班级课程成绩的Min,Max,Avg

1)准备数据

李明,一班,语文,80
韩梅梅,一班,语文,90
李明,一班,数学,90
韩梅梅,一班,数学,90
露西,二班,语文,90
莉莉,二班,语文,100
露西,二班,数学,100
莉莉,二班,数学,90
CREATE TABLE yishou_daily_test.score_detail (
    name string,
    class string,
    course string,
    score int
) 
...
  1. 多维度分组聚合计算
SELECT 
coalesce(class,'全部') as class,
coalesce(course,'全部') as course,
Min(score) as min_score,
Max(score) as max_score,
Avg(score) as avg_score
from
yishou_daily_test.score_detail
GROUP BY 
class,
course
GROUPING SETS(
        (class),
        (course),
        (class,course),
        ()
    )

执行结果:

classcoursemin_scoremax_scoreavg_score
一班全部809087.5
一班语文809085
一班数学909090
全部全部8010091.25
全部数学9010092.5
全部语文8010090
二班数学9010095
二班全部9010095
二班语文9010095
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

修破立生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值