Свинья на латыни загрузить ctrl+M текст с разделителями

У меня много файлов (> 100 КБ), и в каждом файле есть запись, разделенная ctrl + M и разделенная \n. Внутри каждого поля данные разделены вертикальной чертой. Pig обрабатывает ctrl+M как разделитель строк, когда мы используем PigStorage(). Я попытался использовать TextLoader(), и он показал такое же поведение. Любые предложения о том, как запустить это в Pig? В этом случае предварительная обработка файлов может оказаться невозможной. Пожалуйста, дайте мне знать, если у вас есть какие-либо предложения.

Образец данных:

abc|^~\&|1100|7G^M0|1|2|3|4|5^Mpqr|^^^00|82|L

Окончательный вывод (1 строка - разделитель ^M): ((abc,^~\&,1100,7G),(0,1,2,3,4,5)(pqr,^^^00,82,L))


person user3327034    schedule 26.02.2015    source источник
comment
Можете ли вы вставить некоторые образцы входных данных?   -  person Sivasakthi Jayaraman    schedule 27.02.2015
comment
хорошо, каков ваш ожидаемый результат от этих данных?   -  person Sivasakthi Jayaraman    schedule 27.02.2015


Ответы (1)


ОБНОВЛЕНИЕ:

ввод:

abc|^~\&|1100|7G^M0|1|2|3|4|5^Mpqr|^^^00|82|L

ПигСкрипт:

A = LOAD 'input' AS (line:chararray);
B = FOREACH A GENERATE FLATTEN(STRSPLIT(line,'\\^M')) AS(col1:chararray,col2:chararray,col3:chararray);
C = FOREACH B GENERATE FLATTEN(TOBAG(col1,col2,col3));
D = FOREACH C GENERATE FLATTEN(STRSPLIT($0,'\\|'));
DUMP D;

Вывод:

(abc,^~\&,1100,7G)
(0,1,2,3,4,5)
(pqr,^^^00,82,L)
person Sivasakthi Jayaraman    schedule 27.02.2015
comment
Привет, спасибо, что изучили это. Я не уверен, поняли ли вы это. В строке есть символ ctrl+M. Вот выдержка из Pig: Record Delimiters — для операторов загрузки Pig интерпретирует перевод строки ('\n'), возврат каретки ('\r' или CTRL-M) и комбинацию CR + LF ('\r\n') символы в качестве разделителей записей (не используйте эти символы в качестве разделителей полей). Для инструкций сохранения Pig использует символ перевода строки ('\n') в качестве разделителя записи. Источник: pig.apache.org/docs/r0.8.1/piglatin_ref2.html< /а> - person user3327034; 27.02.2015
comment
Да, я неправильно понял ваш вопрос. Можете ли вы сказать мне, каков окончательный формат вывода для вышеуказанного ввода? - person Sivasakthi Jayaraman; 27.02.2015
comment
Я пытаюсь получить \n в виде строки, а затем использовать STRSPLIT, чтобы разделить ее на основе ^M. Другой вариант — использовать ^M в качестве разделителя, а затем использовать STRSPLIT для данных конвейера. Я обновил вопрос с окончательным выводом. - person user3327034; 27.02.2015
comment
Привет, Сиваскти, как ты набираешь символы ctrl+M? Я не уверен, что вы понимаете вопрос. Для простоты используйте следующий пример. a^Mb^Mc в качестве входных данных. Теперь используйте свинью для загрузки этих данных. a = load 'sample.out' using PigStorage('\n') as (line:chararray); dump a; когда вы запустите это, вы увидите 3 кортежа в данных. PigStorage() не рассматривает Ctrl+M как разделитель полей и вместо этого принимает его за конец строки. - person user3327034; 27.02.2015
comment
Извините за введение в заблуждение. Я обновил исходный пост с правильным выводом. - person user3327034; 27.02.2015