2012-07-19 67 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