Flatten восстанавливает только первый элемент в chararray

У меня есть следующие данные (загруженные в переменную A):

(a1:a2:a3|a4:a5:a6)
(b1:b2:b3)
(c1:c2:c3|c4:c5:c6|c7:c8:c9)

Я хочу, чтобы мой окончательный результат был следующим:

(a1:a2:a3)
(a4:a5:a6)
(b1:b2:b3)
(c1:c2:c3)
(c4:c5:c6)
(c7:c8:c9)

Вот что я сделал:

B = foreach B generate flatten(STRSPLIT($0, '\\|')) as splitted:chararray;

Это преобразовало данные в:

(a1:a2:a3,a4:a5:a6)
(b1:b2:b3)
(c1:c2:c3,c4:c5:c6,c7:c8:c9)

со следующей структурой:

B: {splitted: chararray}

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

req_output = foreach B generate flatten(STRSPLIT(splitted, ','));

req_output = foreach B generate flatten(TOBAG(*));

В обоих случаях я получаю следующий вывод:

(a1:a2:a3)
(b1:b2:b3)
(c1:c2:c3)

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


person Himanshu Gahlot    schedule 18.05.2015    source источник


Ответы (1)


В relation B вы сохраняете только первый элемент (т.е. splitted variable), что является причиной этой проблемы. Можете ли вы удалить переменную splitted из отношения B?

B = foreach B generate flatten(STRSPLIT($0, '\\|')) as splitted:chararray;

КОМУ

B = foreach B generate flatten(STRSPLIT($0, '\\|'));

Вы можете решить эту проблему двумя способами.

ввод:

a1:a2:a3|a4:a5:a6
b1:b2:b3
c1:c2:c3|c4:c5:c6|c7:c8:c9

Вариант 1. Использование TOKENIZE

A = LOAD 'input' USING PigStorage() AS(line:chararray);
B = FOREACH A GENERATE FLATTEN(TOKENIZE(line,'\\|'));
DUMP B;

Вариант 2. Использование STRSPLIT + TOBAG

A = LOAD 'input' USING PigStorage() AS(line:chararray);
B = FOREACH A GENERATE FLATTEN(STRSPLIT(line,'\\|'));
C = FOREACH B GENERATE FLATTEN(TOBAG(*));
DUMP C;

Вариант 3. Использование STRSPLITTOBAG (только в Pig версии 0.14)

A = LOAD 'input' USING PigStorage() AS(line:chararray);
B = FOREACH A GENERATE FLATTEN(STRSPLITTOBAG(line,'\\|'));
DUMP B;

Вывод:

(a1:a2:a3)
(a4:a5:a6)
(b1:b2:b3)
(c1:c2:c3)
(c4:c5:c6)
(c7:c8:c9)
person Sivasakthi Jayaraman    schedule 19.05.2015