У меня есть таблица со столбцами страна (chararray), население (int), зона (int). Мне нужно найти страну с большим населением, где зона равна 1. Мне нужно указать название страны и население на консоли.

Я попробовал эти утверждения после загрузки.

fl = filter st by zone==1;
grp = group fl by zone;
result = foreach grp generate fl.country,MAX(fl.population);
dump result

Это дает мне все имена и население. Я могу попробовать «Заказать по» и «Лимит», но мне просто нужно использовать функцию MAX.

Я пытался сгладить оператор, но он просит меня попробовать явное приведение. Не могли бы вы проверить это.

Здесь я включаю образцы данных

country,population,zone
india 3000 1
Australia 4000 2
US 5000 1
China 3000 1
Russia 500 1
2
abhishek tiwari 23 Фев 2016 в 10:01

4 ответа

Лучший ответ

То же самое можно сделать следующим образом:

A = load 'data' using PigStorage(' ') as (c:chararray,p:int,z:int);
B = filter A by z==1;
C = foreach (group B all) {
    ordered = order B by p DESC; 
    limited = limit ordered 1; 
    generate flatten(limited)
}
dump C;

Основное преимущество этого подхода перед MAX заключается в том, что вы можете легко настроить его, чтобы получить «верхний K» (просто замените параметр оператора limit). Кроме того, я думаю, что он использует меньше заданий по уменьшению карты - фильтрация выполняется в картографе, все остальное делается в редукторе. Использование MAX + Filtering после этого требует двух заданий.

4
Ran Locar 24 Фев 2016 в 07:33

Используйте встроенную функцию TOP, чтобы получить верхние N кортежей пакета

data = LOAD 'data' using PigStorage(' ') AS (c:chararray,p:int,z:int);
filtered = FILTER A by z==1;
grouped = GROUP filtered ALL;
max = FOREACH grouped {
    top = TOP(1,1,data);
    GENERATE FLATTEN(top);
}
DUMP max;
0
baba 5 Дек 2018 в 03:06

Решите эту проблему, выполнив простые действия:

country = LOAD '/home/cloudera/pig/country_population.txt' using PigStorage(',') AS (country:chararray, population:int, zone:int);

countryZone1 = filter country by zone == 1;

countryZone1Order = order countryZone1 by population DESC;

countryZone1Limit = limit countryZone1Order 1;

getMaxPopCountry = foreach countryZone1Limit generate country,population;

dump getMaxPopCountry;

OutPut:

(США, 5000)

0
Crime_Master_GoGo 12 Авг 2018 в 04:05

Данные

India 3000 1
Australia 4000 2
US 5000 1
China 3000 1
Russia 500 1

Скрипт

A = LOAD 'test6.txt' USING PigStorage(' ') AS (c:chararray,p:int,z:int);
B = FILTER A BY z==1;
C = FOREACH B GENERATE $0,$1;
D = GROUP C ALL;
E = FOREACH D GENERATE MAX(C.p) as P;
F = FILTER C BY p == (int)E.P;
DUMP F;

Вывод

Max

1
VK_217 23 Фев 2016 в 22:30