HiveSQL或SparkSQl中group by与grouping sets、with cube和with rollup用法演示

tech2026-09-25  2

GROUPING SETS: 根据不同的维度组合进行聚合,等价于将不同维度的GROUP BY结果集进行UNION ALL 数据准备:

建表语句: create table tmp.gb( a string, b string, c int )row format delimited fields terminated by '\t' stored as textfile; 案例数据: 1 1 1 2 1 2 2 2 2 2 2 3 2 1 2 1 2 2

使用案例:

第一种组合: select a,b,sum(c) from gb group by a,b grouping sets(a); 1 NULL 3 2 NULL 9 第二种组合: select a,b,sum(c) from gb group by a,b grouping sets(b); NULL 1 5 NULL 2 7 第三种组合: select a,b,sum(c) from gb group by a,b grouping sets(a,b); NULL 1 5 NULL 2 7 1 NULL 3 2 NULL 9 第四种组合: select a,b,sum(c) from gb group by a,b grouping sets((a,b)); 1 1 1 1 2 2 2 1 4 2 2 5 第五种组合: select a,b,sum(c) from gb group by a,b grouping sets((a,b),a); 1 NULL 3 1 1 1 1 2 2 2 NULL 9 2 1 4 2 2 5 特殊组合: select a,b,sum(c) from gb group by a,b; 1 1 1 1 2 2 2 1 4 2 2 5 通过案例演示,发现grouping sets是可以细化到每一种组合,不同的组合可以通过其他的组合进行union实现,其中直接使用group by 和使用grouping sets((a,b))效果是一致的,可以理解为group by是grouping sets的其中一个组合。

创建表:

CREATE TABLE DEPART (部门 char(10),员工 char(6),工资 int) INSERT INTO DEPART SELECT 'A','ZHANG',100 INSERT INTO DEPART SELECT 'A','LI',200 INSERT INTO DEPART SELECT 'A','WANG',300 INSERT INTO DEPART SELECT 'A','ZHAO',400 INSERT INTO DEPART SELECT 'A','DUAN',500 INSERT INTO DEPART SELECT 'B','DUAN',600 INSERT INTO DEPART SELECT 'B','DUAN',700 部门         员工       工资 A             ZHANG     100 A             LI        200 A             WANG      300 A             ZHAO      400 A             DUAN      500 B             DUAN      600 B             DUAN      700

ROLLUP演示

SELECT 部门,员工,SUM(工资)AS TOTAL FROM DEPART GROUP BY  部门,员工  WITH ROLLUP;

结果如下: A             DUAN      500 A             LI        200 A             WANG      300 A             ZHANG     100 A             ZHAO      400 A             NULL      1500 B             DUAN      1300 B             NULL      1300 NULL          NULL      2800

ROLLUP结果集中多了三条汇总信息:即部门A的合计,部门B的合计以及总合计。其中将部门B中的DUAN合计。等价于下列SQL语句

SELECT 部门,员工,SUM(工资)AS TOTAL FROM DEPART GROUP BY 部门,员工 union SELECT 部门,'NULL',SUM(工资)AS TOTAL FROM DEPART GROUP BY  部门 union SELECT 'NULL','NULL',SUM(工资)AS TOTAL FROM DEPART 结果: A             DUAN      500 A             LI        200 A             NULL      1500 A             WANG      300 A             ZHANG     100 A             ZHAO      400 B             DUAN      1300 B             NULL      1300 NULL          NULL      2800

CUBE演示

SELECT 部门,员工,SUM(工资)AS TOTAL FROM DEPART GROUP BY 部门,员工 WITH CUBE 结果: A       DUAN      500 A       LI        200 A       WANG      300 A       ZHANG     100 A       ZHAO      400 A       NULL      1500 B       DUAN      1300 B       NULL      1300 NULL    NULL      2800 NULL    DUAN      1800 NULL    LI        200 NULL    WANG      300 NULL    ZHANG     100 NULL    ZHAO      400

CUBE的结果集是在 ROLLUP结果集的基础上多了5行,这5行相当于在ROLLUP结果集上在union 上以员工 (即CUBE)为 GROUP BY的结果。

等价于下列的SQL语句:

SELECT 部门,员工,SUM(工资)AS TOTAL FROM DEPART GROUP BY  部门,员工  WITH ROLLUP union SELECT 'NULL',员工,SUM(工资)AS TOTAL FROM DEPART GROUP BY 员工 结果: NULL    NULL     2800 A       NULL     1500 A       DUAN     500 A       LI       200 A       WANG     300 A       ZHANG    100 A       ZHAO     400 B       NULL     1300 B       DUAN     1300 NULL    DUAN     1800 NULL    LI       200 NULL    WANG     300 NULL    ZHANG    100 NULL    ZHAO     400  

最新回复(0)