我有一个猪拉丁问题。我有一张表格如下:
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对表进行分组(假设A
是LOAD
表):
W = GROUP A BY ID;
但我似乎无法弄清楚的是只返回每个ID的最低价格值的命令。 在此示例中,最终输出应为:
1:John:20:B1
2:Chris:35:B2
3:John:20:B3
干杯,
Shivedog
答案 0 :(得分:0)
选项(1) - 获取最高价格的所有记录:
使用新的(Pig 0.11)RANK运算符:
A = LOAD ...;
B = RANK A BY Price DESC;
C = FILTER B BY $0=1;
选项(2) - 获取最高价格的所有记录:
Pig版本低于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);
答案 1 :(得分: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最低价格相同,那么这只会返回其中一个。