pig拉丁搜索变量名称和最小值

xmq68pz9  于 2021-06-25  发布在  Pig
关注(0)|答案(2)|浏览(271)

我有个拉丁Pig问题。我有一张table,上面有:

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

我可以使用以下方法(假设 ALOAD 表):

W = GROUP A BY ID;

但我似乎无法理解的是,命令只返回每个id的最低价格值。在本例中,最终输出应该是:

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

干杯,
希维多格

zy1mlcev

zy1mlcev1#

一般来说你会想 GROUP 通过投标,然后使用 MIN . 但是,由于您希望整个元组与最小值相关联,因此您需要使用udf来实现这一点。
我的自定义项.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有相同的最低价格,那么这将只返回其中一个。

hmae6n7t

hmae6n7t2#

选项(1)-以最高价格获取所有记录:
使用新的(pig 0.11)秩运算符:

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);

相关问题