2012-07-19 112 views
0

这是我的表1查找TOP 3的两列匹配

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 

所以下面的数据。如果我需要澄清上述scenario-我喜欢这个 - 用户1345653我在上面的表中的数据此PID 330760137950four 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,然后我需要那些随时间排序的TOP 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 

这是错误的,因为我缺少上述Expected Output的最后两行。谁能帮我这个?

回答

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服务器。我不认为你是......

无论如何。我的建议是,您将您的排名功能移入您拥有的嵌套选择内。在外面选择你想要的地方它少于三...我不知道你的语法。我不应该回答这个问题。对不起....大声笑

这里: http://ragrawal.wordpress.com/2011/11/18/extract-top-n-records-in-each-group-in-hadoophive/ 你的排名()是在外部选择...它需要在内部。尽管如此,请将< 4或< = 3或其他任何内容留在外部声明中。你的查询几乎看起来就像那个例子......只需要一些改变。

基于链路和我的蜂巢知识的绝对缺乏...我想你可能希望这样:

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 

,我不能测试或编译,因为老实说,我根本不知道是什么配置单元在你发布你的问题之前。 (小世界,我知道,很伤心 - 真实)

+0

是的。我在蜂巢工作。我使用此查询通过修改您的'选择buyer_id,ITEM_ID,CREATED_TIME从( \t \t选择buyer_id,ITEM_ID,CREATED_TIME,秩()以上(由buyer_id分区,由CREATED_TIME降序ITEM_ID顺序)为k \t \t从testingtable1)作为x \t其中k <= 3 \t order by buyer_id,item_id,created_time desc;'我得到的错误是'FAILED:解析错误:行2:52不匹配的输入'('期望FROM from子句'。建议为什么它是这样的? – ferhan 2012-07-19 21:43:08

+0

没有....我不知道你的代码在sql server中运行它可能不喜欢那个嵌套select作为唯一的“表”.....你可能需要将嵌套select一个临时表,然后从#temp中选择*,其中k <= 3或其他......? – 2012-07-19 21:49:18

+0

或配置单元没有rank()...对不起! – 2012-07-19 21:52:53