Предположим, у меня есть входной файл 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
на «другое» и перегруппируйте. Наконец,UNION
результат вместе сabove_threshold
, а затем снова запустите окончательную проекцию. - Или точно следуйте исходному сценарию, но при создании
projection
сгенерируйтеa
условно (на основеSUM(sources.b)
), затем перегруппируйтеprojection
(чтобы сгруппировать все «другие» строки вместе), а затем снова спроецируйте (чтобы сгладить повторные строки). сгруппированные данные).
Является ли один из вышеперечисленных подходов явно лучше другого? Или есть другой подход, который будет более эффективным или простым в обслуживании?