Проблема
У меня есть внутренний мешок, состоящий из вложенных кортежей, которые не нужны для моей ожидаемой схемы. Я хотел бы удалить один из слоев кортежа, чтобы у меня остался только простой внутренний мешок. Я использую 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)})
Что мне не хватает?