Свинья: получить верхние значения n для каждой группы
У меня есть данные, которые уже сгруппированы и агрегированы, это выглядит так:
user value count
---- -------- ------
Alice third 5
Alice first 11
Alice second 10
Alice fourth 2
...
Bob second 20
Bob third 18
Bob first 21
Bob fourth 8
...
Для каждого пользователя (Алиса и Боб), я хочу получить их верхние n значений (допустим, 2), отсортированные термины "count".
Поэтому желаемый результат, который я хочу, таков:
Alice first 11
Alice second 10
Bob first 21
Bob second 20
Как я могу это сделать?
Ответы
Ответ 1
Один подход -
records = LOAD '/user/nubes/ncdc/micro-tab/top.txt' AS (user:chararray,value:chararray,counter:int);
grpd = GROUP records BY user;
top3 = foreach grpd {
sorted = order records by counter desc;
top = limit sorted 2;
generate group, flatten(top);
};
Вход:
Alice third 5
Alice first 11
Alice second 10
Alice fourth 2
Bob second 20
Bob third 18
Bob first 21
Bob fourth 8
Выход:
(Alice,Alice,first,11)
(Alice,Alice,second,10
(Bob,Bob,first,21)
(Bob,Bob,second,20)
Ответ 2
Я только что сделал замечание, что
top = limit sorted 2;
top является встроенной функцией и может вызывать ошибку, поэтому единственное, что я сделал, это изменение имени в этом случае и вместо
generate group, flatten(top);
который выдавал выход
(Alice,Alice,first,11)
(Alice,Alice,second,10
(Bob,Bob,first,21)
(Bob,Bob,second,20)
Изменили это, как показано ниже -
records = load 'test1.txt' using PigStorage(',') as (user:chararray, value:chararray, count:int);
grpd = GROUP records BY user;
top2 = foreach grpd {
sorted = order records by count desc;
top1 = limit sorted 2;
generate flatten(top1);
};
который дал мне желаемый результат, как вам требуется -
(Alice,first,11)
(Alice,second,10)
(Bob,first,21)
(Bob,second,20)
Надеюсь, что это поможет.