更新时间:2023-04-28 GMT+08:00

Spark SQL ROLLUP和CUBE使用的注意事项

问题

假设有表src(d1, d2, m),其数据如下:

1 a 1
1 b 1
2 b 2

对于语句select d1, sum(d1) from src group by d1, d2 with rollup其结果如下:

NULL 0
1    2
2    2
1    1
1    1
2    2

对于以上结果的第一条为什么是(NULL,0)而不是(NULL,4)。

回答

在进行rollup和cube操作时,用户通常是基于维度进行分析,需要的是度量的结果,因此不会对维度进行聚合操作。

例如当前有表src(d1, d2, m),那么语句1“select d1, sum(m) from src group by d1, d2 with rollup”就是对维度d1和d2进行上卷操作计算度量m的结果,因此有实际业务意义,而其结果也跟预期是一致的。但语句2“select d1, sum(d1) from src group by d1, d2 with rollup”则从业务上无法解释。当前对于语句2所有聚合(sum/avg/max/min)结果均为0。

只有在rollup和cube操作中对出现在group by中的字段进行聚合结果才是0,非rollup和cube操作其结果跟预期一致。