Hive中with cube、with rollup、grouping sets用法

表结构


 
 
  1. CREATE TABLE test (f1 string,
  2. f2 string,
  3. f3 string,
  4. cnt int) ROW FORMAT delimited FIELDS TERMINATED BY '\t' stored AS textfile;
  5. LOAD DATA LOCAL inpath '/data/logs/suiyingli/tmp/test.data' overwrite INTO TABLE test;

原始数据

•A A B 1
•B B A 1
•A A A 2

1、with cube

查询语句


 
 
  1. SELECT f1,
  2. f2,
  3. f3,
  4. sum(cnt),
  5. GROUPING__ID,
  6. rpad( reverse( bin( cast(GROUPING__ID AS bigint))), 3, '0')
  7. FROM test
  8. GROUP BY f1,
  9. f2,
  10. f3 WITH CUBE;

结果

with cube查询结果

2、with rollup

查询语句


 
 
  1. SELECT f1,
  2. f2,
  3. f3,
  4. sum(cnt),
  5. GROUPING__ID,
  6. rpad( reverse( bin( cast(GROUPING__ID AS bigint))), 3, '0')
  7. FROM test
  8. GROUP BY f1,
  9. f2,
  10. f3 WITH ROLLUP;

结果

with rollup查询结果

3、grouping sets

查询语句


 
 
  1. SELECT f1,
  2. f2,
  3. f3,
  4. sum(cnt),
  5. GROUPING__ID,
  6. rpad( reverse( bin( cast(GROUPING__ID AS bigint))), 3, '0')
  7. FROM test
  8. GROUP BY f1,
  9. f2,
  10. f3
  11. GROUPING SETS((f1),(f1,f2))

结果

grouping sets查询结果

总结

cube的分组组合最全,是各个维度值的笛卡尔(包含null)组合,
rollup的各维度组合应满足,前一维度为null后一位维度必须为null,前一维度取非null时,下一维度随意,
grouping sets则为自定义维度,根据需要分组即可。
ps:通过grouping sets的使用可以简化SQL,比group by单维度进行union性能更好。


2、with cube统计结果处理:

CUBE 操作所生成的空值带来一个问题:如何区分 CUBE 操作所生成的 NULL 值和从实际数据中返回的 NULL 值?这个问题可用 GROUPING 函数解决。如果列中的值来自事实数据,则 GROUPING 函数返回 0;如果列中的值是 CUBE 操作所生成的 NULL,则返回 1。在 CUBE 操作中,所生成的 NULL 代表全体值。可将 SELECT 语句写成使用 GROUPING 函数将所生成的 NULL 替换为字符串 ALL。因为事实数据中的 NULL 表明数据值未知,所以 SELECT 语句还可译码为返回字符串 UNKNOWN 替代来自事实数据的 NULL。例如:


 
 
  1. SELECT CASE WHEN ( GROUPING(Item) = 1) THEN 'ALL'
  2. ELSE ISNULL(Item, 'UNKNOWN')
  3. END AS Item,
  4. CASE WHEN ( GROUPING(Color) = 1) THEN 'ALL'
  5. ELSE ISNULL(Color, 'UNKNOWN')
  6. END AS Color,
  7. SUM(Quantity) AS QtySum
  8. FROM Inventory
  9. GROUP BY Item, Color WITH CUBE;

多维数据集
CUBE 运算符可用于生成 n 维的多维数据集,即具有任意数目维度的多维数据集。只有一个维度的多维数据集可用于生成合计,例如:


 
 
  1. -- 此 SELECT 语句返回的结果集既显示了 Item 中每个值的小计,也显示了 Item 中所有值的总计:
  2. SELECT CASE WHEN ( GROUPING(Item) = 1) THEN 'ALL'
  3. ELSE ISNULL(Item, 'UNKNOWN')
  4. END AS Item,
  5. SUM(Quantity) AS QtySum
  6. FROM Inventory
  7. GROUP BY Item WITH CUBE;

 

    • 1
      点赞
    • 0
      收藏
      觉得还不错? 一键收藏
    • 0
      评论
    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

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

    余额充值