2011-03-07 54 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

相關問題