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

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

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

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

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

  1. select userid,
  2. MIN(install_date),
  3. MIN(level_up_date),
  4. MIN(new_item_date)
  5. from (
  6. select
  7. userid,
  8. CASE when type = 'install' then event_timestamp else null as install_date,
  9. CASE when type = 'level_up' then event_timestamp else null as level_up_date,
  10. CASE when type = 'new_item' then event_timestamp else null as new_item_date
  11. from event_table
  12. ) group by userid;

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

  1. userid install_date level_up_date new_item_date
  2. 01 2018-01-01 null null
  3. 01 null 2018-01-15
  4. 01 null null 2018-02-03

而不是:

  1. userid install_date level_up_date new_item_date
  2. 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#

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

  1. select userid,
  2. MIN(CASE when type = 'install' then event_timestamp END) as install_date,
  3. MIN(CASE when type = 'level_up' then event_timestamp END) as level_up_date,
  4. MIN(CASE when type = 'new_item' then event_timestamp END) as new_item_date
  5. from event_table
  6. group by userid

相关问题