1

我有一个简单的表:

UserID  EventTimestamp
...     ...

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

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

4

2 回答 2

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

在这里拉小提琴。

于 2013-04-29T13:55:02.677 回答
1

这应该有效。内部查询使用 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]
于 2013-05-06T17:20:05.593 回答