用户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)。
但这是全数据集扫描。
1条答案
按热度按时间t0ybt7op1#
这称为条件聚合。下面的方法可行。