2011-03-07 77 views
8

我有一组记录,我从一个文件中加载,我需要做的第一件事是获取列的最大值和最小值。 在SQL我会这样子查询做到这一点:PIG中整套记录的最大值/最小值

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 

我认为必须有一个简单的方法来做到这一点猪很好,但我无法找到它。它有一个最大和最小的功能,但是当我试着做以下没有工作:

records=LOAD '/Users/Winter/School/st_incm.txt' AS (state:chararray, population:int); 
with_max = FOREACH records GENERATE state, population, MAX(population); 

这没有奏效。我有更好的运气为每行添加一个具有相同值的额外列,然后将它们分组到这一列。然后获得新组的最大值。这似乎是一种让我想要得到的令人费解的方式,所以我想我会问有没有人知道更简单的方法。

在此先感谢您的帮助。

回答

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) 
+0

谢谢 - 我知道必须有一个简单的方法来做到这一点。 – Winter 2011-03-10 23:56:22