找到两列匹配的前三名

时间:2012-07-19 21:24:41

标签: hadoop mapreduce hive hiveql

这是我的表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

所以基本上如果BIDPID相同但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的最后两行。任何人都可以帮我这个吗?

1 个答案:

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

我无法测试或编译,因为老实说我在发布你的问题之前不知道什么是蜂巢。 (小世界,我知道,太伤心了 - 太真实了)