Макс / мин для целых наборов записей в PIG - PullRequest
8 голосов
/ 07 марта 2011

У меня есть набор записей, которые я загружаю из файла, и первое, что мне нужно сделать, это получить максимум и минимум столбца. В 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);

Это не сработало. Мне посчастливилось добавить дополнительный столбец с одинаковым значением в каждую строку, а затем сгруппировать их по этому столбцу. Затем получите максимум в этой новой группе. Кажется, это извилистый способ получить то, что я хочу, поэтому я подумал, что могу спросить, знает ли кто-нибудь более простой способ.

Заранее спасибо за помощь.

1 Ответ

15 голосов
/ 08 марта 2011

Как вы сказали, вам нужно сгруппировать все данные вместе, но при использовании GROUP ALL .

дополнительный столбец не требуется.

Pig

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);

Input

CA  10
VA  5
WI  2

выход

(CA,10,10)
(VA,5,10)
(WI,2,10)
...