hive--GROUPING SETS方法产生的聚合问题

本文提供了一个具体的PV(页面浏览量)和UV(独立访客数)计算案例,通过SQL查询来展示如何根据不同维度如活动ID、页面名称等进行汇总统计。通过对原始数据的分组和聚合操作,详细说明了计算过程及GROUPING SETS的使用。
--- 这是计算pv uv指标
  select
    COALESCE(activity_id,'ALL')             as activity_id          
    , COALESCE(page_name,'ALL')             as page_name

    , COALESCE(product,'ALL')               as product
    , COALESCE(product_browse_name,'ALL')   as product_browse_name

    , COALESCE(platform,'ALL')              as platform
    
    , COALESCE(entry_src,'ALL')             as entry_src
    , GROUPING__ID
    , SUM(show_cnt)                         as show_cnt
    , COUNT(distinct user_id)               as show_user_num
  FROM(
      select  
        activity_id
        , product
        , page_name
        , platform

        , product_browse_name
        , entry_source    AS entry_src
        , user_id
        , count(1)  as show_cnt
      from
        xxx.xxxxx
      WHERE
        p_date = '20201006'
        and show_page_action='mm'
      group by 
        activity_id
        , product
        , page_name
        , platform
        , product_browse_name
        , entry_source
        , user_id
      )t1
  group by
    activity_id
    , page_name

    , product
    , product_browse_name

    , platform
    , entry_src
  GROUPING SETS(
    (product_browse_name,platform,entry_src),
    (activity_id,page_name,product,product_browse_name),
    (activity_id,page_name,platform),
    (activity_id,page_name,entry_src),
    (activity_id,page_name,product,product_browse_name,platform),
    (activity_id,page_name,product,product_browse_name,entry_src),
    (activity_id,page_name,platform,entry_src),
    (activity_id,page_name,product,product_browse_name,platform,entry_src)
  )
select
    product_browse_name
    , platform
    , entry_src
    , SUM(show_cnt)                         as show_cnt
    , COUNT(distinct user_id)               as show_user_num
    , COUNT(distinct device_id)             as show_device_num
  FROM(
      select  
        activity_id
        , page_name
        , product
        , product_browse_name
        
        , platform
        , entry_source    AS entry_src
        , device_id
        , user_id
        , count(1)  as show_cnt
      from
        xxx.xxxx
      WHERE
        p_date = '20201006'
        and show_page_action='mm'
      group by 
        activity_id
        , product
        , page_name
        , platform
        , product_browse_name
        , entry_source
        , device_id
        , user_id
      )t1
  group by
    product_browse_name
    , platform
    , entry_src

上面那个结果 grouping__id为56的为什么和下面的结果不一样

### 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、付费专栏及课程。

余额充值