2013-10-08 27 views
0

我有一個拉丁的豬問題。我有如下表:豬拉丁文搜索變量名和最小值

ID:Seller:Price:BID 
1:John:20:B1 
1:Ben:25:B1 
2:John:60:B2 
2:Chris:35:B2 
3:John:20:B3 

我能集團通過以下ID表(假設ALOAD表):

W = GROUP A BY ID; 

但我不能似乎弄清楚是隻返回每個ID的最低價格的值的命令。 在這個例子中,最終輸出應爲

1:John:20:B1 
2:Chris:35:B2 
3:John:20:B3 

乾杯,
Shivedog

+0

我對你如何得到B1和B2有點困惑,難道不是B1和B3?你想通過身份證得到最低的價格嗎? – mr2ert

+0

所以我發佈的例子有點偏離。我有兩張表: – user2857300

回答

0

選項(1) - 獲取與最高價格的所有記錄:

使用新的(豬0.11) RANK操作:

​​

選項(2) - 獲取與馬所有記錄ximum價格:

豬版本低於0.11:

a = load ...; 
b = group a by all; 
c = foreach b generate MAX(a.price) as maxprice; 
d = JOIN a BY price, c BY maxprice; 

選項(3) - 使用org.apache.pig.piggybank.evaluation.ExtremalTupleByNthField獲得與最高價的元組之一:

define mMax org.apache.pig.piggybank.evaluation.ExtremalTupleByNthField('4', 'max'); 

a = load ...; 
b = group a by all; 
c - foreach b generate mMax(a); 
+0

嗨SNeumann,我試過這個命令,但不幸的是我們僅限於使用豬0.8.0。 – user2857300

+0

好的。因此,除此之外,編寫一個UDF通過在一個組上執行它來完成與RANK類似的事情,您可以通過分組並獲得最大值然後加入原始集合來實現。即: a =負載...; b =所有a組; c = foreach b將max(a.price)作爲maxprice生成; d =加入BY價格,c BY maxprice; – SNeumann

+0

@SNeumann你可以把它添加到你的答案?此外,應該指出的是,如果有多個項目具有相同的最低價格,則將返回所有這些項目而不是一個。 – mr2ert

0

通常你會在BID想GROUP,然後使用MIN。但是,由於您希望整個元組與最小值相關聯,因此您需要使用UDF來執行此操作。

myudfs.py

@outputSchema('vals: (ID: int, Seller: chararray, Price: chararray, BID: chararray)') 
def get_min_tuple(bag): 
    return min(bag, key=lambda x: x[2]) 

myscript.pig

register 'myudfs.py' using jython as myudfs ; 

-- A: (ID: int, Seller: chararray, Price: chararray, BID: chararray) 

B = GROUP A BY BID ; 
C = FOREACH B GENERATE group AS BID, FLATTEN(myudfs.get_min_tuple(A)) ; 

-- Now you can do the JOIN to get the type of novel on C 

記住改變類型(int,chararray等)爲適當的值。

備註:如果A中的多個項目具有相同的ID最小价格,那麼這將只返回其中一個。