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

4

2 回答 2

0

选项 (1) - 获取所有最高价格的记录:

使用新的(Pig 0.11)RANK 运算符:

A = LOAD ...;
B = RANK A BY Price DESC;
C = FILTER B BY $0=1;

选项 (2) - 获取所有最高价格的记录:

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);
于 2013-10-09T08:48:47.997 回答
0

通常你会想要GROUP通过 BID,然后使用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])

我的脚本.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 等)更改为适当的值。

注意:如果一个 ID 中的多个项目A具有相同的最低价格,那么这将只返回其中一个。

于 2013-10-11T21:27:43.717 回答