HiveQL:在一对多表中查找第N个值

时间:2013-04-29 13:18:54

标签: mysql sql hive hiveql

我有一张简单的表格:

UserID  EventTimestamp
...     ...

用户可以拥有任意数量的事件(从无到有)。我需要运行 HiveQL 查询,该查询将提取第3个事件的时间戳(按升序排列)。少于3个事件应该导致null。

是否有一个解决方案不需要使用UDF模拟 rank()

2 个答案:

答案 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]