如何使用pig中的max函数检索对应行的最大值?

nr9pn0ug  于 2021-06-21  发布在  Pig
关注(0)|答案(4)|浏览(380)

我有一个列为country(chararray)、population(int)、zone(int)的表。我需要找到一个人口更多的国家,那里的区域等于1。我需要控制台上的国家名称和人口。
我试过这些陈述。

fl = filter st by zone==1;
grp = group fl by zone;
result = foreach grp generate fl.country,MAX(fl.population);
dump result

它给了我所有的名字和人口。我可以尝试“order by”和“limit”,但我只需要使用max函数。
我试图压平运算符,但它要求我尝试显式转换。你能核实一下吗。
这里我包括了样本数据

country,population,zone
india 3000 1
Australia 4000 2
US 5000 1
China 3000 1
Russia 500 1
z4iuyo4d

z4iuyo4d1#

数据

India 3000 1
Australia 4000 2
US 5000 1
China 3000 1
Russia 500 1

脚本

A = LOAD 'test6.txt' USING PigStorage(' ') AS (c:chararray,p:int,z:int);
B = FILTER A BY z==1;
C = FOREACH B GENERATE $0,$1;
D = GROUP C ALL;
E = FOREACH D GENERATE MAX(C.p) as P;
F = FILTER C BY p == (int)E.P;
DUMP F;

输出

guicsvcw

guicsvcw2#

请用简单的步骤解决:

country = LOAD '/home/cloudera/pig/country_population.txt' using PigStorage(',') AS (country:chararray, population:int, zone:int);

countryZone1 = filter country by zone == 1;

countryZone1Order = order countryZone1 by population DESC;

countryZone1Limit = limit countryZone1Order 1;

getMaxPopCountry = foreach countryZone1Limit generate country,population;

dump getMaxPopCountry;

输出:
(5000美元)

46qrfjad

46qrfjad3#

同样可以通过以下方式实现:

A = load 'data' using PigStorage(' ') as (c:chararray,p:int,z:int);
B = filter A by z==1;
C = foreach (group B all) {
    ordered = order B by p DESC; 
    limited = limit ordered 1; 
    generate flatten(limited)
}
dump C;

与max相比,这种方法的主要优点是您可以轻松地调整它以获得“topk”(只需替换limit语句的参数)。另外,我认为它使用更少的map reduce作业-过滤在mapper中完成,其余的都在reducer中完成。在需要两个作业之后使用max+过滤。

jdgnovmf

jdgnovmf4#

使用内置的top函数获取包的前n个元组

data = LOAD 'data' using PigStorage(' ') AS (c:chararray,p:int,z:int);
filtered = FILTER A by z==1;
grouped = GROUP filtered ALL;
max = FOREACH grouped {
    top = TOP(1,1,data);
    GENERATE FLATTEN(top);
}
DUMP max;

相关问题