如何聚合事件以进行非规范化?

cunj1qz1  于 2021-06-26  发布在  Hive
关注(0)|答案(1)|浏览(273)

用户clickstream由具有类型和事件时间戳属性的事件表示。例如:

userid  type        event_timestamp (yyyy-MM-ddThh:mm:ss.SSS)
01      install     2018-01-01T00:00:00.000
01      level_up    2018-01-15T00:00:00.000
01      new_item    2018-02-03T00:00:00.000

所有输入数据都存储在 event_timestamp 字段,例如进入 2018-01-01 , 2018-01-02 ... 它的文件夹。
对于do反规范化,有这样一个hackle(hive)(只是一个想法,语法没有检查):

select userid,
    MIN(install_date),
    MIN(level_up_date),
    MIN(new_item_date)
from (
    select
        userid,
        CASE when type = 'install' then event_timestamp else null as install_date,
        CASE when type = 'level_up' then event_timestamp else null as level_up_date,
        CASE when type = 'new_item' then event_timestamp else null as new_item_date
        from event_table
) group by userid;

对所有数据执行此操作时,一切正常。但是分区呢?
当输入数据按 event_timestamp 并且只对新到达的数据执行处理(例如,单独处理输入分区),而不是1行,我得到3行(当然是在不同的分区中):

userid  install_date  level_up_date new_item_date
 01      2018-01-01        null        null
 01      null           2018-01-15
 01      null              null     2018-02-03

而不是:

userid  install_date  level_up_date new_item_date
  01      2018-01-01    2018-01-15   2018-02-03

请注意,日期之间的时间间隔是无限的-用户发送 install 即使是今年和 level_up 明年。有什么共同的方法可以解决这个问题吗?理论上,我可以将不同的事件存储到不同的分区中,并在整个已处理的数据集中执行select userid、min(install\u date)、min(level\u up\u date)、min(new\u item\u date)。
但这是全数据集扫描。

t0ybt7op

t0ybt7op1#

这称为条件聚合。下面的方法可行。

select userid,
MIN(CASE when type = 'install' then event_timestamp END) as install_date,
MIN(CASE when type = 'level_up' then event_timestamp END) as level_up_date,
MIN(CASE when type = 'new_item' then event_timestamp END) as new_item_date
from event_table
group by userid

相关问题