对于新旧hive版本中grouping_id计算方式不同造成的差异化解决方案

工作中使用多维度分组时并不想写一大堆union all,为了便于代码简洁喜欢使用grouping_id这个函数,使用久了会发现hive_1.2.1版本以前的grouping_id计算方式和以后的计算方式会有所不同步。这样造成使用这个函数的时候如果存在历史数据使用时存在着矛盾,这时很多聪明人会想到的解决办法就是把不同的grouping_ID产生的数据按照时间分段开来重新计算,这样会造成许多大量重复的代码。在没有想到下面这个解决方案时,那种根据不同时间段groupingID 分段计算是一种解决方案但不是最佳方案。以下介绍一种最佳解决方案。
1.groupingID的计算方式,分新旧俩个版本
GROUP BY a,b,c,d,e
GROUPING SETS ( (a,b,c,d,e) 11111 GROUPING_ID=32 | 00000 GROUPING_ID=0 hive_1.2._1
,(a,b,d,e) 11011 GROUPING_ID=27 | 00100 GROUPING_ID=4 hive_1.2._1
,(a,c,d,e) 11101 GROUPING_ID=29 | 01000 GROUPING_ID=8 hive_1.2._1
,() 00000 GROUPING_ID=0 | 11111 GROUPING_ID=32 hive_1.2._1
)
由此上图可见按|分割是新旧版本hive的groupingID计算方式,举例说明GROUP BY a,b,c,d,e是五个维度,那么我们计算其中一组分组GROUPING SETS(b,c,d,e)。旧版本计算方式,假设五个维度都在则是11111.现在我们可以看到这一组中缺少了一个a。则我们可以把111111看作是默认的edcba对应的位置出现就是1。现在分组(b,c,d,e)缺少了a,则将a位置的1置为0.其结果是11110.对应的十进制GROUPING_ID=30

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值