Можно ли перекрестно соединить строку в отношении с кортежем в этой строке в Pig?

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

Alice\tApple:Orange\tSacramento
Bob\tApple\tSan Diego
Charlie\tApple:Pineapple\tSacramento

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

Apple\tSacramento\t2
Apple\tSan Diego\t1
Orange\tSacramento\t1
Pineapple\tSacramento\t1

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

Alice\tApple:Orange\tSacramento

становится:

Alice\tApple\tSacramento 
Alice\tOrange\tSacramento

Я знаю, что могу использовать TOKENIZE для разделения строки "Apple:Orange" на кортеж ("Apple", "Orange"), но я не знаю, как получить перекрестное произведение этого кортежа с остальной частью строки ( «Алиса»).


Одно решение грубой силы, которое я придумал, состоит в том, чтобы использовать потоковую передачу для запуска входной коллекции через внешнюю программу и обрабатывать «перекрестное соединение» для создания нескольких строк в строке.

Хотя кажется, что это должно быть ненужным. Есть ли лучшие идеи?


person Chris Phillips    schedule 13.09.2011    source источник
comment
Я должен отметить, что эта проблема похожа, но отличается от другого вопроса, который я задал: stackoverflow.com/questions/7406392/   -  person Chris Phillips    schedule 13.09.2011
comment
Что за отрицательный ответ на вопрос и ответ без объяснения причин?   -  person Chris Phillips    schedule 13.09.2011
comment
Я понятия не имею, о чем вы спрашиваете, но +1, чтобы исправить тихое отрицательное голосование.   -  person    schedule 13.09.2011
comment
@pst: Спасибо за вотум доверия.   -  person Chris Phillips    schedule 13.09.2011


Ответы (1)


Вы должны использовать FLATTEN, который отлично работает с TOKENIZE, чтобы делать разные вещи. так.

b = FOREACH a GENERATE name, FLATTEN(TOKENIZE(fruits)) as fruit, city;

FLATTEN берет сумку и "расправляет" ее по разным рядам. TOKENIZE разбивает ваши фрукты в сумку (а не кортеж, как вы сказали), а затем FLATTEN выполняет перекрестное поведение, как вы ищете. Указываю, что это мешок, а не кортеж, потому что FLATTEN перегружен и ведет себя с кортежами по-разному.

Впервые я узнал о технике FLATTEN/TOKENIZE в примере с каноническим подсчетом слов, в котором слово разбивается на токены, а затем сглаживается в строки.

person Donald Miner    schedule 14.09.2011
comment
Круто - я совершенно пропустил, что TOKENIZE создал сумку вместо кортежа. Спасибо! - person Chris Phillips; 14.09.2011