这是我的Table1 中的以下数据
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
所以,如果我需要澄清上述情况,我在上表中有这样的数据-对于用户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
不同,那么我需要按时间降序排列的前3个
为此,我在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
这是错误的,因为我遗漏了上面CCD_ 8的最后两行。有人能帮我吗?
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。我不认为你是。。。。。。。。
无论如何。我的建议是,将您的排名函数移动到嵌套的select中。在外面选择你想要的地方,它小于三。。。我不知道你的语法。我不该回答这个问题。很抱歉lol
此处:http://ragrawal.wordpress.com/2011/11/18/extract-top-n-records-in-each-group-in-hadoophive/您的rank()位于外部select。。。它需要在内部。离开<4或<=3或外部where语句中的任何内容。您的查询几乎与该示例完全相同。。。只需要一些改变。
基于链接和我对蜂巢知识的绝对缺乏。。。我想你可能想要这个:
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
我不能测试或编译,因为老实说,在你发布问题之前,我根本不知道hive是什么。(小世界,我知道,很悲伤-很真实)