2014-10-01 79 views
0

我想知道,每個人最近買了什麼物品。假設同一個人可以購買許多物品。豬分組功能

下面是輸入詳細

kumar,2014-09-30,television 
kumar,2014-07-27,smartphone 
Andrew,2014-06-21,camera 
Andrew,2014-05-20,car 

我需要的輸出如下

kumar,2014-09-30,television 
Andrew,2014-06-21,camera 

我寫了一個豬腳本高達本,但在那之後我不知道如何着手,可以有人幫助我

A = LOAD 'records.txt' USING PigStorage(',') AS(name:chararray,date:chararray,item:chararray); 
B = GROUP A BY name; 
C = FOREACH B GENERATE group,MAX(A.date); 

但我需要得到每個人最近購買的物品。我如何得到這個。如果我應用GROUP,那麼我應該只使用Pig中的聚合函數。

我如何獲得已購買的收貨物品?

回答

0

使用手提袋和在嵌套的foreach中進行排序,它將只使用1個MR作業,並且更多使用Apache Pig風格。

A = LOAD 'input.txt' USING PigStorage(',') AS(name:chararray,date:chararray,item:chararray); 
B = GROUP A BY name; 
C = FOREACH B { 
    ordered = ORDER A BY date DESC; -- this will cause secondary sort to optimise the execution 
    latest = LIMIT ordered 1; 
    GENERATE FLATTEN(latest); - advantage of PIG, that all columns are preserved and not dropped as on SQL group by 
}; 

DUMP C; 

還可以使用$ 0,$ 1等很方便,但是想象一下,你有一個腳本與數百行和幾十組通過,並加入用「$」該項目的操作,這是一場噩夢,瞭解流動信息/列通過這樣的腳本。時間浪費在維護上,並且對這些腳本進行更改是巨大的。

-1

我希望這適合你。

input.txt 
kumar,2014-09-30,television 
kumar,2014-07-27,smartphone 
Andrew,2014-06-21,camera 
Andrew,2014-05-20,car 

PigScript: 
A = LOAD 'input.txt' USING PigStorage(',') AS(name:chararray,date:chararray,item:chararray); 
B = GROUP A BY name; 
C = FOREACH B GENERATE group,FLATTEN(MAX($1.date)); 
D = JOIN A BY date,C BY $1; 
E = FOREACH D GENERATE $0,$1,$2; 
DUMP E; 

Output: 
(Andrew,2014-06-21,camera) 
(kumar,2014-09-30,television) 
+0

是的。感謝這..看起來不錯。我會試試這個。我們也可以使用rank的概念來實現相同的邏輯 – 2014-10-01 17:19:56

+0

這個解決方案在SQL風格上太多了,Pig不是SQL它有袋子。該解決方案將強制2個MR作業而不是1個。 – alexeipab 2014-10-02 07:32:09