这是我的表1中的以下数据
BID PID TIME
---------+-------------------+----------------------
1345653 330760137950 2012-07-09 21:42:29
1345653 330760137950 2012-07-09 21:43:29
1345653 330760137950 2012-07-09 21:40:29
1345653 330760137950 2012-07-09 21:41:29
1345653 110909316904 2012-07-09 21:29:06
1345653 221065796761 2012-07-09 19:31:48
所以如果我需要澄清上述情况 - 我在上表中有数据如下 -
对于USER 1345653
,我有这个PID 330760137950
four times
但具有不同的时间戳。所以我需要像这样的输出 -
我需要的输出: -
1345653 330760137950 2012-07-09 21:43:29
1345653 330760137950 2012-07-09 21:42:29
1345653 330760137950 2012-07-09 21:41:29
1345653 110909316904 2012-07-09 21:29:06
1345653 221065796761 2012-07-09 19:31:48
所以基本上如果BID
和PID
相同但timestamps
不同,那么我需要按降序排序的前三个中的前三个
为此,我在Hive中创建了rank UDF
(用户定义函数)。我写了下面的查询,但它不适合我。任何人都可以帮我吗?
SELECT bid, pid, rank(bid), time, UNIX_TIMESTAMP(time)
FROM (
SELECT bid, pid, time
FROM table1
where to_date(from_unixtime(cast(UNIX_TIMESTAMP(time) as int))) = '2012-07-09'
DISTRIBUTE BY bid,pid
SORT BY bid, time desc
) a
WHERE rank(bid) < 3;
因此,通过上面的查询,我得到像这样的输出
1345653 330760137950 2012-07-09 21:43:29
1345653 330760137950 2012-07-09 21:42:29
1345653 330760137950 2012-07-09 21:41:29
这是错误的,因为我错过了上面Expected Output
的最后两行。任何人都可以帮我这个吗?
答案 0 :(得分:1)
select bid, pid, [time] from (
select bid, pid, [time], rank() over (partition by bid, pid order by [time] desc) as k
from #temp ) as x
where k <=3
order by bid, pid, time desc
哦,我在sql server中。我不认为你是........
反正。我的建议是你在你拥有的嵌套选择中移动你的等级函数。在外面选择你想要它少于三...我不知道你的语法。我不应该回答这个问题。抱歉....大声笑
这里: http://ragrawal.wordpress.com/2011/11/18/extract-top-n-records-in-each-group-in-hadoophive/ 你的rank()在外部选择......它需要在内部。离开&lt;但是,4或者&lt; = 3或者外部where语句中的任何内容。您的查询几乎与该示例完全相同......只需要进行一些更改。
基于链接和我对Hive的绝对缺乏知识......我想你可能想要这个:
SELECT bid, pid, time
FROM (
SELECT bid, pid, rank(time) as rank, time
FROM $compTable
DISTRIBUTE BY bid, pid
SORT BY bid, pid, time desc
) a
WHERE rank < 4
ORDER BY bid, pid, time desc
我无法测试或编译,因为老实说我在发布你的问题之前不知道什么是蜂巢。 (小世界,我知道,太伤心了 - 太真实了)