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

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

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

--- 这是计算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 的用法 #### 基本概念 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、付费专栏及课程。

余额充值