我有一张简单的表格:
UserID EventTimestamp
... ...
用户可以拥有任意数量的事件(从无到有)。我需要运行 HiveQL 查询,该查询将提取第3个事件的时间戳(按升序排列)。少于3个事件应该导致null。
是否有一个解决方案不需要使用UDF模拟 rank()?
答案 0 :(得分:2)
如果您可以使用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
小提琴here。
答案 1 :(得分:1)
这应该有效。内部查询使用DISTRIBUTE BY和SORT BY按userid对时间戳进行排序;然后通过collect_set将时间弹出到数组中。然后得到第3个元素。
我无法让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]