在上次介绍了Sql中的窗口分析函数,本次在Hive上进行实操说明CUBE,ROLLUP,GROUPING SETS等分析函数。
对于这些函数子句可以认为是对于 Hive中的 增强型聚合函数 ,可以使用它们构建小型的多维分析模型
- CUBE创建列集维度的所有可能组合的小计。一旦在一组维度上计算了一个立方体,我们就可以得到这些维度上所有可能的聚合问题的答案
GROUP BY a, b, c WITH CUBE 相当于如下两种表示 GROUP BY a, b, c GROUPING SETS ( (a, b, c), (a, b), (b, c), (a, c), (a), (b), (c), ( ))
- ROLLUP子句与GROUP BY一起用于计算维度层次结构级别的聚合
GROUP BY a, b, c with ROLLUP 是构建从 a 钻探到b钻探到c的层次结构数据 相当于 GROUPING SETS ( (a, b, c), (a, b), (a), ( ))
普通的 聚合函数
SELECT CategoryName , SalesCountry , sum(SalesAmount) SalesAmount FROM InternetSales GROUP BY CategoryName , SalesCountry
- 使用GROUPING SETS子句及其对应的使用常规gourping by 后union 起来的结果,这样语句量会变得小的多。
SELECT CategoryName , SalesCountry , sum(SalesAmount) FROM InternetSales GROUP BY CategoryName , SalesCountry GROUPING SETS((CategoryName , SalesCountry),CategoryName)
对应的 grouping by 后的 union 语句
SELECT CategoryName , SalesCountry , sum(SalesAmount) SalesAmount FROM InternetSales GROUP BY CategoryName , SalesCountry UNION ALL SELECT CategoryName , null SalesCountry, sum(SalesAmount) SalesAmount FROM InternetSales GROUP BY CategoryName
在上述的 使用GROUPING SETS或CUBE,ROLLUP进行聚合的时候,会得到对于null的汇总的结果,但是对于这种情况,无法判断,值原来就是null还是在聚合的过程组合而成的null。 这可能会发生冲突。需要有一些方法来标识列中的NULL是值,也就是说用来表示列中聚合的NULL是值。 GROUPING__ID函数就用来解决这个问题。如下例子:
SELECT WeightUnitMeasureCode , SizeUnitMeasureCode , COUNT(*) CNT
FROM test.DimProduct
GROUP BY WeightUnitMeasureCode , SizeUnitMeasureCode WITH CUBE
对应的 grouping__id进行对null进行区分和编号
所以使用 GROUPING__ID进行分组标识 , 通过 GROUPING__ID 可以得到 SELECT WeightUnitMeasureCode , SizeUnitMeasureCode , GROUPING__ID , COUNT(*) CNT FROM test.DimProduct GROUP BY WeightUnitMeasureCode , SizeUnitMeasureCode WITH CUBE