8

我有一组从文件加载的记录,我需要做的第一件事是获取列的最大值和最小值。在 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);

这没有用。我最好为每一行添加一个具有相同值的额外列,然后将它们分组到该列上。然后在那个新组中获得最大值。这似乎是一种获得我想要的东西的复杂方式,所以我想我会问是否有人知道更简单的方法。

在此先感谢您的帮助。

4

1 回答 1

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)
于 2011-03-08T19:44:39.883 回答