Свинья - Создание группы заданного размера - PullRequest
1 голос
/ 08 марта 2012
recs = load 'a.txt';
grp = group recs with each group having 5 records;

Мне нужно сделать что-то похожее на вышеприведенное.
Так что, если в recs есть 10 записей, я хочу, чтобы группы создавались так, чтобы
в каждой группе было по 5 записей.

Как это сделать?

1 Ответ

0 голосов
/ 08 марта 2012

Масштабируемое решение может состоять в том, чтобы UDF накапливал записи в новую сумку и выводит сумку, когда в ней есть 5 элементов и пустую сумку (или ноль), если ее нетесть 5 элементов еще.

Один недостаток состоит в том, что последняя группа каждой карты может иметь менее 5 элементов (поэтому можно попробовать заполнить их нулями или отбросить / перегруппировать их все).

recs = load 'a.txt';
grp_5 = foreach recs generate GROUPER(*, 5) as group;
grp = filter grp by not IsEmpty(group);

Редактировать для комментария:

Обычный атрибут Bag был бы хорош, поскольку UDF обычно создается в начале карты, после чего его exec () вызывается для каждой записи.Думайте что-то вроде потоковой передачи всех записей через него, как функцию MAX.

...