我有一组记录,我从文件中加载,我需要做的第一件事就是获取列的最大值和最小值。 在SQL中,我会使用这样的子查询来执行此操作:
select c.state, c.population,
(select max(c.population) from state_info c) as max_pop,
(select min(c.population) from state_info c) as min_pop
from state_info c
我认为在PIG中必须有一种简单的方法可以做到这一点,但我找不到它。它有MAX和MIN功能但是当我尝试执行以下操作时它不起作用:
records=LOAD '/Users/Winter/School/st_incm.txt' AS (state:chararray, population:int);
with_max = FOREACH records GENERATE state, population, MAX(population);
这不起作用。我更幸运的是为每一行添加一个具有相同值的额外列,然后将它们分组到该列上。然后获得该新组的最大值。这似乎是一种令人费解的方式来获得我想要的东西所以我想我会问是否有人知道更简单的方法。
提前感谢您的帮助。
答案 0 :(得分:15)
正如您所说,您需要将所有数据组合在一起,但如果您使用GROUP ALL则不需要额外的列。
猪
records = LOAD 'states.txt' AS (state:chararray, population:int);
records_group = GROUP records ALL;
with_max = FOREACH records_group
GENERATE
FLATTEN(records.(state, population)), MAX(records.population);
输入
CA 10
VA 5
WI 2
输出
(CA,10,10)
(VA,5,10)
(WI,2,10)