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

表结构

CREATE TABLE test (f1 string,
                   f2 string,
                   f3 string,
                   cnt int) ROW FORMAT delimited FIELDS TERMINATED BY '\t' stored AS textfile;
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

with cube查询语句

SELECT f1,
       f2,
       f3,
       sum(cnt),
       GROUPING__ID,
       rpad(reverse(bin(cast(GROUPING__ID AS bigint))),3,'0')
FROM test
GROUP BY f1,
         f2,
         f3 WITH CUBE;

with cube结果范例


rollup查询语句
SELECT f1,
       f2,
       f3,
       sum(cnt),
       GROUPING__ID,
       rpad(reverse(bin(cast(GROUPING__ID AS bigint))),3,'0')
FROM test
GROUP BY f1,
         f2,
         f3 WITH ROLLUP;

rollup结果范例


grouping sets查询语句
SELECT f1,
       f2,
       f3,
       sum(cnt),
       GROUPING__ID,
       rpad(reverse(bin(cast(GROUPING__ID AS bigint))),3,'0')
FROM test
GROUP BY f1,
         f2,
         f3
GROUPING sets((f1),(f1,f2))
grouping sets结果范例

总结

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值