【问题标题】:Compare two partitions of table in Hive比较 Hive 中表的两个分区
【发布时间】:2021-07-25 19:21:27
【问题描述】:

我需要比较 Hive 中两个表分区的数据变化。具体来说,我有两个分区(ptn_dt='01-31-2019' 和 ptn_dt='02-28-2019')。每个分区都包含以下列 - num_key 和 active_indicator(true 或 false)。

我需要确定以下内容:

  • 一个。新条目的计数(num_key 存在于 ptn_dt='02-28-2019' 但 nut 存在于 ptn_dt='01-31-2019'),active_indicator='true'
  • 乙。月份之间 active_indicator 中发生变化的条目计数(num_key 存在于两个分区中,在 ptn_dt='01-31-2019' 中 active_indicator 为“false”,在 ptn_dt='02-28-2019'中 active_indicator 为“true”李>
  • c。月份之间 active_indicator 中没有变化的条目计数(num_key 存在于两个分区中,在 ptn_dt='01-31-2019' 中 active_indicator 为“true”,在 ptn_dt='02-28-2019'中 active_indicator 为“true”

    到目前为止,我使用下面的 Hive SQL 查询成功地获得了按 active_indicator 分组的每个分区的计数。但是,我在尝试在分区之间进行比较时遇到了麻烦。

    """SELECT active_indicator,count(*) from table_name WHERE ptn_dt='2019-01-31' GROUP BY active_indicator"""
    

    使用示例数据和所需结果进行编辑:

    ptn_dt = '2019-01-31'

    num_key active_indicator
    111 true
    112 false
    113 false
    114 false
    115 true
    116 true

    ptn_dt = '2019-02-28'

    num_key active_indicator
    111 true
    112 false
    113 true
    114 true
    115 true
    116 true
    117 true
    118 false
    119 true

    输出:

  • 1。 active_indicator = 'true' = 2 的新条目计数(与 num_key 117 和 119 相关)
  • 2。 active_indicator 中发生变化的条目数(从假到真) - 2 个月之间(与 num_key 113 和 114 相关
  • 3。 active_indicator 中没有变化的条目计数(从真到真)在 3 个月之间(与 num_key 111、115 和 116 相关)
  • 【问题讨论】:

    • 请提供样本数据和期望的结果。
    • 你好。我刚刚用一些示例详细信息和所需结果编辑了帖子。
    • 我尝试了您分享的最新编辑,不确定,但它没有返回任何值? :( 不确定我是否错过了什么。
    • 请帮忙。 @戈登林诺夫

    标签: python sql hive partition


    【解决方案1】:

    您可以使用条件聚合。这会将比较放在同一行:

    SELECT active_indicator,
           SUM(CASE WHEN ptn_dt = '2019-01-31' THEN 1 ELSE 0 END),
           SUM(CASE WHEN ptn_dt = '2019-02-28' THEN 1 ELSE 0 END)
    FROM table_name
    WHERE ptn_dt IN ('2019-01-31', '2019-02-28')
    GROUP BY active_indicator;
    

    或者,在不同的行中,您可以使用:

    SELECT active_indicator, ptn_dt, COUNT(*)
    FROM table_name
    WHERE ptn_dt IN ('2019-01-31', '2019-02-28')
    GROUP BY active_indicator, ptn_dt;
    

    编辑:

    根据您的评论,请使用lag()。对于所有组合:

    select prev_active_indicator, active_indicator, count(*)
    from (select t.*,
                 lag(active_indicator) over (partition by num_key order by ptn_dt) as prev_active_indicator
          from table_name t
          where ptn_dt IN ('2019-01-31', '2019-02-28')
         ) t
    where ptn_dt = '2019-02-28'
    group by prev_active_indicator, active_indicator;
    

    【讨论】:

    • 对不起,我试过了,但这只是返回每个 ptn_dt 的真假计数。如何计算 active_indicator 更改的条目(例如,相同的 num_key 但 1 月份的 active_indicator=false 和 2 月份的 active_indicator=true)?还有那些活动指标没有变化的人的数量(一月和二月都是如此)?最后,计算那些新的 num_key(存在于二月分区而不是一月)?
    • 你好。我刚刚用示例数据和所需的输出编辑了帖子。
    • 我尝试了您分享的最新编辑,不确定,但它没有返回任何值? :( 不知道我是否错过了什么
    • 希望样本数据和输出让问题更清晰。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多