如何使用PIG中的MAX函数检索其对应行的最大值?

时间:2016-02-23 07:01:18

标签: apache-pig

我有一个包含列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

它给了我所有的名字和人口。我可以尝试按顺序排列'和'限制',但我只需要使用MAX功能。

我试图压扁操作符,但它要求我尝试显式转换。 你可以验证吗。

这里我包含了样本数据

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

4 个答案:

答案 0 :(得分:3)

同样可以通过这种方式实现:

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的主要优点是你可以轻松地调整它以给你最好的K' (只需替换limit语句的参数)。 此外,我认为它使用较少的map-reduce作业 - 过滤在mapper中完成,其余的都在reducer中完成。在需要两个作业后使用MAX + Filtering。

答案 1 :(得分:1)

数据

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;

<强>输出

Max

答案 2 :(得分:0)

请通过简单的步骤解决:

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)

答案 3 :(得分:0)

使用内置的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;