1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| 多维分析函数(不常用) SELECT stuId, CASE WHEN grade IS NULL AND class IS NULL THEN 'all' WHEN grade IS NOT NULL THEN 'grade' ELSE 'class' END key, CASE WHEN grade IS NULL AND class IS NULL THEN 'all' WHEN grade IS NOT NULL THEN grade ELSE class END value,dt FROM ( SELECT stuId,grade,class,dt FROM school GROUP BY grade,class,stuId,dt grouping sets ((stuId,dt),(grade,stuId,dt),(class,stuId,dt)) ) a
# Job数(Spark/Hive) 3/1
# 优点 在Hive/Spark执行中,相较于GroupBy执行计划更优
# 缺点 最大的缺点就是,需要进行NULL值填充 尤其是不能确定原始数据中是否有值为NULL的字段
# 补充点 对于其缺点有grouping__id函数进行完善 grouping__id为位向量,计算逻辑如下 grade,class,stuId,dt四个分组字段 0000 在分组集合内的置为1,否则置为0 坑: 最右边的表示第1列,依次类推 然后进行反转,计算出十进制值 (stuId,dt)->0011->1100->12 (grade,stuId,dt)->1011->1101->13 (class,stuId,dt)->0111->1110->14 假如有字段为空,那么其grouping__id字段值将发生改变 e.g: 其他分组字段有为空的情况 10086,2020-05-13,null,null,12->(选择stuId,dt) 10086,2020-05-13,null,null,13->(选择grade,stuId,dt,但是grade有空值) 这样就可以很好的辨认分组字段是什么
|