我有一个包含列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
答案 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;
<强>输出强>
答案 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;