как создать набор значений после групповой функции в Pig (Hadoop)

Допустим, у меня есть набор значений в file.txt
a, b, c
a, b, d
k, l, m
k, l, n
k, l, o

И мой код:
file = LOAD 'file.txt' using PigStorage (',');
events = foreach file generate session_id, user_id, code, type;
gr = группировать события по (session_id, user_id);

и я установил значение:

((a,b),{(a,b,c),(a,b,d)})
((k,l),{(k,l,m),(k,l,n),(k,l,o)})

И я бы хотел иметь: (a, b, (c, d))
(k, l, (m, n, o))

Вы знаете, как это сделать?

С уважением, Павел


person psmith    schedule 18.10.2013    source источник


Ответы (1)


Примечание: вы непоследовательны в своем вопросе. Вы говорите session_id, user_id, code, type в строке FOREACH, но у вас есть хранилище PigStorage, не предоставляющее значений. Кроме того, этот FOREACH имеет 4 значения, а в ваших данных выборки только 3. Я предполагаю, что type не существует, чтобы ответить на ваш вопрос.


После отношения gr вы останетесь с группой по ключу (в данном случае (session_id, user_id)) в автоматически сгенерированном кортеже с именем group.

Итак, первый шаг: gr2 = FOREACH gr GENERATE FLATTEN(group); Это даст вам кортежи (a,b) и (k,l). Вам нужно использовать FLATTEN, потому что group - это кортеж, и вы запрашиваете, чтобы session_id и user_id были отдельными столбцами. FLATTEN сделает это за вас.

Хорошо, теперь измените строку gr2, чтобы также использовать проекцию для выделения третьего значения:

gr2 = FOREACH gr GENERATE FLATTEN(group), events.code;

events.code создает мешок из всех code значений. events - имя пакета сгруппированных кортежей (названо в честь исходного отношения).

Это должно дать вам:

 (a, b, {c, d})
 (k, l, {m, n, o})

Очень важно отметить, что значения в списке находятся в сумке, а не в кортеже, как вы просили. Хранить его в сумке - правильная идея, потому что сумка - это список переменных, а кортеж - нет.


Дополнительный совет: понимание того, как GROUP BY выводит данные, - это то, с чем, как я вижу, многие люди испытывают затруднения при первом использовании Pig. Если вы думаете, что мой ответ не имеет особого смысла, я бы рекомендовал потратить некоторое время, чтобы по-настоящему понять GROUP BY. Понимание против мысли, что это магия, в конечном итоге окупится.

person Donald Miner    schedule 18.10.2013