HIVE中grouping__id使用场景

  • grouping__id值的计算方式

例子:

step01:数据准备如下

​create table temp.temp_xw_20180127 as
select '2018-01'  as dt_month, null as type, 12 total
union all 
select '2018-01'  as dt_month, '收入' as type, 100 total
step02:对表temp.temp_xw_20180127做汇总

select
  a.dt_month
 ,a.type
 ,grouping__id  as set_id
 ,sum(total)    as total
from temp.temp_xw_20180127 a
group by a.dt_month
        ,a.type
with rollup

运行结果如下:

HIVE中grouping__id使用场景_第1张图片

step03:数据解释

--====
--把分组字段即group by后的a.dt_month和a.type处理成2进制
--靠近group by的分组字段为低位,远离为高位
--====
--set_id=0同以下SQL统计结果(a.dt_month a.type=00对应二进制为00十进制为0) 
select
  null          as dt_month
 ,null          as type 
 ,sum(total)    as total
from temp.temp_xw_20180127 a

--set_id=1同以下SQL统计结果(a.dt_month a.type=10对应二进制为01十进制为1) 
select
  a.dt_month
 ,null          as type 
 ,sum(total)    as total
from temp.temp_xw_20180127 a
group by a.dt_month

--set_id=3同以下SQL统计结果(a.dt_month a.type=11对应二进制为11十进制为3)
select
  a.dt_month
 ,a.type 
 ,sum(total)    as total
from temp.temp_xw_20180127 a
group by a.dt_month
        ,a.type 

  • grouping__id的应用1、区分字段中有为null值时该行属性(具体时汇总还是明细数据),下图圈中的部分数据为2条不同属性的数据

HIVE中grouping__id使用场景_第2张图片

  • grouping__id的应用2、利用其是二进制生成,可对其定位该条数据分组字段有哪些

select  
  concat( if(substring(bin(cast(set_id as bigint)),-1,1)=1 , 'dt_month' , '')
         ,if(substring(bin(cast(set_id as bigint)),-2,1)=1 , ',type' , '')
        )  as group_by
  ,a.set_id
  ,a.dt_month
  ,a.type
  ,a.total
from
(  
  select
    a.dt_month
   ,a.type
   ,grouping__id  as set_id
   ,sum(total)    as total
  from temp.temp_xw_20180127 a
  group by a.dt_month
          ,a.type
  with rollup
) a

结果







你可能感兴趣的:(SQL)