hive高级分组聚合grouping sets,cube,rollup

本文介绍了Hive中用于聚合查询的高级特性——GroupingSets、Cube和Rollup,详细解释了它们的语法和应用场景,并通过示例展示了它们如何简化复杂的SQL查询。这些功能在特定的数据分析任务中非常有用,但使用场景相对较少。

 

        日常使用较少,主要记录grouping sets,cube,rollup这三个分组聚合。

        首先,使用高级分组聚合的语法时,要注意hive是否开启了向量模式。

        set hive.verctorized.execution.enabled = true;

1、grouping sets

select  prov_id
        ,deep
        ,count(1) as num
from    dim.dim_city
where   prov_id = 110000
and     deep = 1
group by prov_id
        ,deep
grouping sets( (prov_id,deep) ,prov_id ,deep )
;

--等同于
select  prov_id
        ,deep
        ,count(1) as num
from    dim.dim_city
where   prov_id = 110000
and     deep = 1
group by prov_id
        ,deep
union all
select  prov_id
        ,null
        ,count(1) as num
from    dim.dim_city
where   prov_id = 110000
and     deep = 1
group by prov_id
union all
select  null
        ,deep
        ,count(1) as num
from    dim.dim_city
where   prov_id = 110000
and     deep = 1
group by deep

2、cube

select  prov_id
        ,deep
        ,count(1) as num
from    dim.dim_city
where   prov_id = 110000
and     deep = 1
group by prov_id
        ,deep
with cube
;

--等同于
select  prov_id
        ,deep
        ,count(1) as num
from    dim.dim_city
where   prov_id = 110000
and     deep = 1
group by prov_id
        ,deep
grouping sets ((prov_id,deep) ,prov_id ,deep ,())
;

3、rollup

select  prov_id
        ,deep
        ,count(1) as num
from    dim.dim_city
where   prov_id = 110000
and     deep = 1
group by prov_id
        ,deep
with rollup
;

--等同于
select  prov_id
        ,deep
        ,count(1) as num
from    dim.dim_city
where   prov_id = 110000
and     deep = 1
group by prov_id
        ,deep
grouping sets ((prov_id,deep) ,prov_id ,())
;

如果确实有比较契合的需求用起来还是比较方便的,但是使用场景确实也少

### HiveGrouping Sets 的用法与示例 在 Hive 中,`GROUPING SETS` 是一种用于多维度聚合的强大功能。它允许用户在一个查询中同时获取多个分组聚合结果,而无需执行多个独立的查询。以下是 `GROUPING SETS` 的详细说明和使用示例。 #### 1. 基本概念 `GROUPING SETS` 允许用户在单个查询中指定多个分组组合,从而一次性获取多维度的聚合结果。如果某个列未包含在 `GROUPING SETS` 中,则对应的聚合结果将为 `NULL`[^2]。 #### 2. 语法结构 以下是 `GROUPING SETS` 的基本语法: ```sql SELECT column1, column2, ..., aggregate_function(column3) FROM table_name GROUP BY GROUPING SETS ( (column1), (column2), (column1, column2), () ); ``` - `(column1)` 表示按 `column1` 分组。 - `(column2)` 表示按 `column2` 分组。 - `(column1, column2)` 表示按 `column1` 和 `column2` 的组合分组。 - `()` 表示全局聚合(不按任何列分组)。 #### 3. 示例数据 假设有一个名为 `sales` 的表,包含以下字段: - `region`: 销售区域 - `product`: 产品名称 - `amount`: 销售金额 #### 4. 使用示例 以下是一个使用 `GROUPING SETS` 的示例查询: ```sql SELECT region, product, SUM(amount) AS total_sales FROM sales GROUP BY GROUPING SETS ( (region), -- 按区域分组 (product), -- 按产品分组 (region, product) -- 按区域和产品组合分组 ); ``` #### 5. 查询结果解释 上述查询会生成以下几类聚合结果: - 按 `region` 分组的销售总额。 - 按 `product` 分组的销售总额。 - 按 `region` 和 `product` 组合分组的销售总额。 对于未包含在某个分组中的列,其值将显示为 `NULL`。例如,当只按 `region` 分组时,`product` 列的值将为 `NULL`[^2]。 #### 6. 辅助函数:`GROUPING()` 为了区分哪些列是通过 `GROUPING SETS` 被设置为 `NULL` 的,可以使用 `GROUPING()` 函数。该函数返回一个整数值,表示某列是否参与了当前分组: - 如果返回 `0`,表示该列参与了当前分组。 - 如果返回 `1`,表示该列未参与当前分组。 示例如下: ```sql SELECT region, product, GROUPING(region) AS is_region_grouped, GROUPING(product) AS is_product_grouped, SUM(amount) AS total_sales FROM sales GROUP BY GROUPING SETS ( (region), (product), (region, product) ); ``` #### 7. 相关扩展功能 除了 `GROUPING SETS`,Hive 还提供了以下类似的聚合功能: - **CUBE**: 自动生成所有可能的分组组合。 - **ROLLUP**: 生成从最低级别到最高级别的分组层次结构。 - **GROUPING_ID**: 返回当前分组的唯一标识符,便于进一步分析[^1]。 #### 8. 注意事项 - `GROUPING SETS` 的性能取决于数据规模和分组数量。过多的分组组合可能导致性能下降。 - 在复杂查询中,建议结合 `GROUPING()` 和 `GROUPING_ID()` 函数以更好地理解结果集。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值