Можно ли обнаружить и обработать столкновения строк между сгруппированными значениями при группировании в Hadoop Pig? - PullRequest
1 голос
/ 13 сентября 2011

Предполагая, что у меня есть строки данных, подобные приведенным ниже, которые показывают имена пользователей и их любимые фрукты:

Alice\tApple
Bob\tApple
Charlie\tGuava
Alice\tOrange

Я хотел бы создать запрос со свиньями, который показывает любимые фрукты каждого пользователя.Если пользователь появляется несколько раз, то я бы хотел показать «Несколько».Например, результат с данными выше должен быть:

Alice\tMultiple
Bob\tApple
Charlie\tGuava

В SQL это можно сделать примерно так (хотя это не обязательно будет работать очень хорошо):

select user, case when count(fruit) > 1 then 'Multiple' else max(fruit) end
from FruitPreferences
group by user

Но я не могу понять эквивалент PigLatin.Есть идеи?

1 Ответ

1 голос
/ 14 сентября 2011

Запишите "Сводная функция" Свинья 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.

Отказ от ответственности: на данный момент я не могу на самом деле протестировать этот код, поэтому он может иметь некоторые ошибки.


Обновление:

При взгляде сложнее мне напомнили о операторе биконда , и я думаю, что он будет работать здесь.

...