HIVE中grouping__id使用场景

本文介绍了Hive中的grouping__id字段,它用于在聚合查询中区分包含NULL值的行是汇总还是明细数据,并可以通过其二进制特性定位分组字段。通过数据准备和实例展示,解析了grouping__id在实际操作中的两种应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 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

运行结果如下:

### Grouping_ID 技术含义 `GROUPING__ID` 是 Hive SQL 中用于区分不同分组级别的特殊列。当使用 `GROUPING SETS`, `CUBE` 或 `ROLLUP` 进行聚合操作时,可能会产生多个不同的分组组合。为了帮助识别这些组合属于哪种分组级别,Hive 提供了 `GROUPING__ID` 来表示当前记录是由哪些维度组成的。 具体来说,`GROUPING__ID` 的值是一个整数,该整数值通过二进制位来指示各个分组字段的状态:如果某一位为 0,则对应的分组字段有效;反之则无效[^1]。 例如,在查询语句中: ```sql SELECT name, type, SUM(amt), GROUPING__ID FROM tmp.shop_detail_tb WHERE dt = '2021-01-30' GROUP BY name, type WITH ROLLUP; ``` 假设只有两个分组键 (`name` 和 `type`) ,那么可能产生的 `GROUPING__ID` 及其解释如下表所示: | Name | Type | Sum(Amt) | GROUPING__ID (Binary) | Meaning | |------|------|----------|-----------------------|------------------------| | A | X | 10 | 00 | Both dimensions present| | B | Y | 20 | 00 | Both dimensions present| | NULL | Y | 30 | 01 | Only `Type` dimension | | A | NULL | 40 | 10 | Only `Name` dimension | | NULL | NULL | 70 | 11 | Grand total | ### 使用示例 下面给出一个具体的例子展示如何利用 `GROUPING__ID` 实现复杂的数据汇总需求: ```sql -- 创建临时表并插入一些测试数据 CREATE TABLE IF NOT EXISTS sales ( region STRING, product STRING, amount INT ); INSERT INTO sales VALUES ('North','A',10); INSERT INTO sales VALUES ('South','B',20); INSERT INTO sales VALUES ('East','C',30); INSERT INTO sales VALUES ('West','D',40); -- 查询各地区各类产品的销售总额,并加上总计行 SELECT COALESCE(region,'Total') AS region, COALESCE(product,'All Products') as product, SUM(amount), GROUPING__ID FROM sales GROUP BY region, product WITH ROLLUP; ``` 此查询不仅会返回按区域和产品分类的结果,还会额外提供每一项的子合计以及整个表格的大计行列。而 `GROUPING__ID` 则用来标记这些附加行的位置以便于进一步处理或过滤显示[^2]。 ### 计算方法 对于更复杂的场景,理解 `GROUPING__ID` 的计算方式非常重要。它基于参与分组设置中的每一个字段位置进行编码。比如有三个分组字段 `[a,b,c]`,那么它们各自对应着二进制位上的最低到最高三位。因此,当某个特定分组不包含其中任何一个字段时,相应的比特会被置为 1 表明缺失状态。这样就可以唯一地定义出任意一组给定条件下的分组模式[^4]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值