hive 高级分组聚合(grouping sets cube和rollup)

本文介绍了Hive中的高级分组聚合操作,包括Grouping Sets、Cube和Rollup。通过实例展示了它们如何简化SQL语句,分别等价于不同的分组组合,并讨论了使用这些功能可能带来的优化和潜在问题,如数据膨胀。

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

1.grouping sets

1.1

select a, b sum(c) from tbl group by a,b grouping sets((a,b))

相当于 select a,b,sum(c) from tbl group by a,b

1.2

select a,b,sum(c) from tbl group by a,b grouping sets((a,b),a)

相当于

select a,b,sum(c) from tbl group by a,b

union

select a,null ,sum(c) from tbl group by a

1.3

select a,b,sum(c) from tbl group by a,b grouping sets(a,b)

相当于

select a,null,sum(c) from tbl group by a

union

select null ,b,sum(c) from tbl group by b

1.4

select a,b,sum(c) from tbl group by a,b grouping sets((a,b),a,b,())

相当于

select a,b,sum(c) from tbl group by a,b

union

select a,null,sum(c) from tbl group by a

union

select null,b,sum(c) from tbl group by b

union

select null,null,sum(c) from tbl

2.cube 会计算所有group by 列的所有组合

select a,b,c,count(1) from tbl group by a,b,c with cub

### HiveGrouping Sets 的用法 #### 基本概念 Grouping Sets 是一种在 Hive 查询中简化多维分组操作的功能。通过使用 `GROUPING SETS`,可以在一条 SQL 语句中实现多个不同维度的聚合逻辑,从而减少多次执行查询的需求[^1]。 #### 语法结构 以下是 `GROUPING SETS` 的基本语法: ```sql SELECT column_list, aggregate_function(column) FROM table_name GROUP BY GROUPING SETS ( (column_set_1), (column_set_2), ... ); ``` 其中: - `column_list`: 需要展示的结果列。 - `aggregate_function`: 聚合函数(如 `SUM`, `AVG`, `COUNT` 等)。 - `(column_set_n)`: 表示一组或多组需要进行分组的列集合。 #### 示例解析 假设有一个表名为 `tableName`,其字段包括 `class`(班级)、`sex`(性别)、`course`(课程)以及 `score`(分数)。我们希望按不同的维度组合来统计平均成绩。 创建临时表存储结果数据: ```sql CREATE TABLE temp.score_grouping AS SELECT grouping__id, class, sex, course, AVG(score) AS avg_score FROM tableName GROUP BY class, sex, course GROUPING SETS ( (class, course), (class, sex), (sex, course), (course) ); ``` 上述代码实现了以下几种分组方式: - 按照 `class` `course` 组合分组; - 按照 `class` `sex` 组合分组; - 按照 `sex` `course` 组合分组; - 单独按照 `course` 分组; 最终结果可以通过查看 `temp.score_grouping` 表获得。对于某些未参与特定分组的字段,在对应记录中会显示为 NULL 值[^3]。 #### 特殊字段 `grouping__id` 当使用 `GROUPING SETS` 时,Hive 自动生成了一个特殊字段 `grouping__id` 来表示当前行属于哪个具体的分组设置。该值是一个整数编码形式,能够帮助区分每条记录来源于哪种分组模式。 例如过滤部分类型的分组结果: ```sql SELECT * FROM temp.score_grouping WHERE grouping__id IN ('2', '6'); ``` 此命令仅返回那些满足条件编号下的汇总信息。 #### 扩展功能 除了 `GROUPING SETS` 外,Hive 提供了其他类似的高级聚合工具,比如 CUBE ROLLUP,它们分别代表全排列交叉分组与逐层累加式的层次化分组[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值