Запишите "Сводная функция" Свинья UDF (прокрутите вниз до "Сводные функции").Это пользовательская функция, которая берет сумку и выводит скаляр.Таким образом, в основном, ваш UDF будет брать в сумке, определять, есть ли в нем более одного элемента, и соответствующим образом преобразовывать его с помощью оператора if.
Я могу придумать способ сделать это без UDF,но это определенно неловкоПосле вашего GROUP
используйте SPLIT
, чтобы разбить ваш набор данных на два: один, в котором счетчик равен 1, и один, в котором счетчик больше одного:
SPLIT grouped INTO one IF COUNT(fruit) == 0, more IF COUNT(fruit) > 0;
Затем отдельно используйте FOREACH ... GENERATE
на каждом для его преобразования:
one = FOREACH one GENERATE name, MAX(fruit); -- hack using MAX to get the item
more = FOREACH more GENERATE name, 'Multiple';
Наконец, объедините их обратно:
out = UNION one, more;
Я не нашел лучшего способа передачи одного и того же набора данных в два разныхспособы, основанные на некоторых условных, как вы хотите.Обычно я делаю что-то вроде разделения / рекомбинации, как здесь.Я верю, что Пиг будет умным и разработает план, который не использует более 1 задания M / R.
Отказ от ответственности: на данный момент я не могу на самом деле протестировать этот код, поэтому он может иметь некоторые ошибки.
Обновление:
При взгляде сложнее мне напомнили о операторе биконда , и я думаю, что он будет работать здесь.