Как использовать FLATTEN для одного уровня в Pig?

Проблема

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

Пример

Образец моих входных данных.

((1,100,0),(2))
((1,100,1),(3,500,60))

Мой желаемый результат.

(100,{(2),(3,500,60)})

Мое текущее состояние после небольшой манипуляции (см. ниже), которая вызвала вопрос выше.

(100,{((2)),((3,500,60))})

Попытки

Я чувствую, что моя сложность заключается в том, что я пытаюсь сгруппировать элемент внутри кортежа. Я сделал простой групповой оператор, который, кажется, оставляет сгруппированные элементы в кортеже (я новичок в Pig).

a = LOAD 'data' as (key:tuple(), data:tuple());
b = GROUP a BY key.$1;
c = FOREACH b GENERATE group as vid, b.data as data;

Сброс c приводит к нежелательному результату, указанному выше. Ключ из нескольких частей (a,b,c) должен быть удален таким образом, чтобы a был удален, b использовался как группа, а c можно было либо удалить, либо нет, но только после того, как он будет использован для создания внутреннего мешка.

Попытка FLATTEN разгруппирует элементы. Затем я могу снова FLATTEN перегруппироваться, но это выглядит немного нелепо. Есть ли лучший способ, чем этот?

d = FOREACH c GENERATE vid, FLATTEN(data) as data;
e = FOREACH d GENERATE vid, FLATTEN(data);
f = GROUP e BY $0;

Это все еще не дает того, что я хочу, так как он держит ключ:

(100,{(100,2),(100,3,500,60)})

Что мне не хватает?


person Jeremy Fortune    schedule 21.12.2015    source источник


Ответы (1)


Вы можете попробовать это. Это немного поможет... но это не эффективное решение. давайте подождем хороших мозгов, чтобы опубликовать свои ответы.

Вход :

 (1,100,0)|(2)
 (1,100,1)|(3,500,60)

Сценарий свинки:

 records = LOAD '/home/user/bags.txt'  USING PigStorage('|')  AS(key:tuple(),value:tuple());

 records_each = FOREACH records GENERATE key.$1 as grouping_key, flatten(value);

 records_grp = GROUP records_each BY $0;

 records_nested_each = FOREACH records_grp

                      {
                        inner_each=   FOREACH records_each GENERATE $1..;

                         GENERATE group, inner_each;

                     };

 dump records_nested_each;

Выход :

  (100,{(2),(3,500,60)})
person Surender Raja    schedule 22.12.2015
comment
Интересно. Я думаю, что блок, вероятно, то, что мне не хватало, и он, безусловно, функционален. - person Jeremy Fortune; 22.12.2015