我有一个简单的表:
UserID EventTimestamp
... ...
用户可以有任意数量的事件(从无到很多)。我需要运行一个HiveQL查询来提取第三个事件的时间戳(按升序排列)。少于 3 个事件应导致 null。
是否有不需要使用 UDF模拟rank()的解决方案?
如果您可以使用 MySQL 查询,则可以使用以下内容:
SELECT
e1.UserID,
MIN(e3.EventTimestamp) ThirdTimestamp
FROM
Events e1 LEFT JOIN Events e2
ON e1.UserID=e2.UserID and e1.EventTimestamp<e2.EventTimestamp
LEFT JOIN Events e3
ON e1.UserID=e3.UserID and e2.EventTimestamp<e3.EventTimestamp
GROUP BY
UserID
在这里拉小提琴。
这应该有效。内部查询使用 DISTRIBUTE BY 和 SORT BY 按用户 ID 对时间戳进行排序;然后通过 collect_set 将时间弹出到一个数组中。然后得到第三个元素。
我无法让 collect_set 在 sub1 中运行,因此我将其结构化,尽管我怀疑必须有更有效的方法。
SELECT userid, time[2] FROM
(SELECT userid, collect_set(eventtimestamp) time FROM
(SELECT userid , eventtimestamp
FROM myTable
DISTRIBUTE BY userid
SORT BY eventtimestamp ASC
LIMIT 3) sub1
GROUP BY userid ) sub2
GROUP BY userid, time[2]