Предположим, у меня есть входной файл input.dat
, который выглядит следующим образом:
apples 10
oranges 30
apples 6
pears 5
Теперь, когда я загружаю, группирую и проецирую данные:
sources = LOAD 'input.dat' as { a:chararray, b:int };
grouped = GROUP sources BY a;
projection = foreach sources generate flatten(group), SUM(sources.b);
dump projection;
Я получаю следующее:
apples 16
oranges 30
pears 5
Теперь я хочу "перегруппировать" данные, где SUM(sources.b)
ниже некоторого порога, в одну строку. Например, если порог был равен 20, я бы получил:
other 21
oranges 30
потому что сумма как для «яблок», так и для «груш» была ниже порога 20.
Мне кажется, что я могу следовать нескольким подходам:
- Используйте оператор
SPLIT
для grouped
, чтобы создать два отношения: above_threshold
и below_threshold
. Затем спроектируйте below_threshold
, чтобы заменить значение a
на "other" и перегруппируйте. Наконец, UNION
, что в результате вместе с above_threshold
, а затем снова запустите окончательный прогноз.
- Или точно следовать исходному сценарию, но при создании
projection
сгенерировать a
условно (на основе SUM(sources.b)
), затем повторно сгруппировать projection
(чтобы сгруппировать все «другие» строки вместе) и затем спроецируйте снова (чтобы сгладить перегруппированные данные).
Один из вышеуказанных подходов явно лучше, чем другой? Или есть другой подход, который будет более эффективным или более простым в поддержке?