Хранить несколько файлов, используя один и тот же сценарий для свиней

Файл имеет данные:

A 12345
B 32122
C 23232

какова возможность запускать только один скрипт свиньи и сохранить первую record(A 12345) в одном файле, second record(B 32122) во втором файле и third(c 23232) в третьем файле. Прямо сейчас, если мы запустим скрипт свиньи, он запустит задание для каждого магазина. Пожалуйста, дайте мне знать этот вариант.

3 ответа

Используйте оператор SPLIT для разделения содержимого отношения на два или более отношений на основе некоторого выражения. В зависимости от условий, указанных в выражении:

A tuple may be assigned to more than one relation.

A tuple may not be assigned to any relation.

пример

В этом примере соотношение A разбивается на три отношения: X, Y и Z.

A = LOAD 'data' AS (f1:int,f2:int,f3:int);

DUMP A; 
(1,2,3)
(4,5,6)
(7,8,9) 

SPLIT A INTO X IF f1<7, Y IF f2==5, Z IF (f3<6 OR f3>6);

DUMP X;
(1,2,3)
(4,5,6)

DUMP Y;
(4,5,6)

DUMP Z;
(1,2,3)
(7,8,9)

затем STORE X, Y, Z в соответствии с вашим именем файла

Моя цель - прочитать файл и записать запись в разные файлы на основе критериев, которые он подойдет вашей проблеме.


Вы можете попробовать с помощью опции MultiStorage(), она будет доступна в банке piggybank. вам нужно загрузить pig-0.11.1.jar и установить его в свой путь к классам.

Пример:input.txt

A 12345
B 32122
C 23232

PigScript:

A = LOAD 'input.txt' USING PigStorage(' ') AS (f1,f2);
STORE A INTO 'output' USING org.apache.pig.piggybank.storage.MultiStorage('output', '0');

Теперь папка вывода содержит 3 dirs A, B, C и имена файлов (A-0,000, B-0,000 и C-0,000), которые содержат фактическое значение выход $ ls

A B C _SUCCESS

выход $ cat A/A-0,000

A 12345

выход $ cat B/B-0,000

B 32122

выход $ cat C/C-0,000

C 23232


На самом деле свинья не предназначена для этого. Но все же, если вы хотите сделать это, тогда вам придется написать функцию пользовательского хранилища. Придется написать некоторый класс, который расширяет класс StoreFunc. Далее внутри него придется использовать несколько выходов, так как вы хотите хранить в трех разных файлах.

См. Https://pig.apache.org/docs/r0.7.0/udf.html#Store+Functions для функции пользовательского хранилища.

В противном случае у свиньи одна команда хранения будет хранить только один псевдоним, только в одном файле.

Для такого требования лучше писать JAVA MR.

licensed under cc by-sa 3.0 with attribution.