Apache Pig не разбирает кортеж полностью - PullRequest
1 голос
/ 12 января 2012

У меня есть файл с именем data, который выглядит следующим образом: (обратите внимание, что после 'personA' есть вкладки)

personA (1, 2, 3)
personB (2, 1, 34)

И у меня есть скрипт Apache pig, подобныйthis:

A = LOAD 'data' AS (name: chararray, nodes: tuple(a:int, b:int, c:int));
C = foreach A generate nodes.$0;
dump C;

Вывод, который имеет смысл:

(1)
(2)

Однако, если я изменю схему скрипта так:

A = LOAD 'data' AS (name: chararray, nodes: tuple());
C = foreach A generate nodes.$0;
dump C;

Тогда вывод, который я получаю, будет таким:

(1, 2, 3)
(2, 1, 34)

Похоже, что первый (и единственный) элемент в этом кортеже является байтовым массивом.то есть он не разбирает входной текст 1, 2, 3 в кортеж.

В будущем у моего ввода будет неизвестное и переменное количество элементов в элементе nodes, поэтому я не могу просто выписать a:int, ….

Есть ли способ заставить Pig анализировать входной кортеж как кортеж без необходимости выписывать полную схему?

Ответы [ 3 ]

4 голосов
/ 12 января 2012

Свинья не принимает то, что вы передаете, как действительное. Схема загрузки по умолчанию PigStorage принимает только файлы с разделителями (по умолчанию вкладка с разделителями). Он недостаточно умен, чтобы анализировать конструкцию кортежа с круглыми скобками и запятыми в тексте. Ваши варианты:

  • Переформатируйте ваш файл, чтобы разделить его табуляцией: personA 1 2 3
  • Считайте файл построчно с TextLoader, затем напишите какой-нибудь UDF , который анализирует строку и возвращает данные в нужной форме.
  • Напишите свой собственный пользовательский загрузчик .
0 голосов
/ 30 октября 2015

Вот еще один способ решения этой проблемы, хотя я знаю, что ответы выше более эффективны.

data = LOAD 'data' USING PigStorage() AS (name:chararray, field2:chararray);

data = FOREACH data GENERATE name, REPLACE(REPLACE(field2, '\\(',''),'\\)','') AS field2;  

data = FOREACH data GENERATE name, STRSPLIT(field2, '\\,') AS fieldTuple;

data = FOREACH data GENERATE name, fieldTuple.$0,fieldTuple.$1, fieldTuple.$2 ;
  1. Загрузить field2 как chararray
  2. Снять скобки
  3. Разделить поле2 запятой (это даст вам кортеж с 3 полями)
  4. Получить значения по индексу

Я знаю, что это хак. Просто хотел предоставить другой способ сделать это

0 голосов
/ 29 октября 2015

Это больше не ограничение.Pig анализирует кортежи во входном файле, рассматривая запятую как разделитель полей.Я пытаюсь в Apache Pig версии 0.15.0.

A = LOAD 'data' AS (name: chararray, nodes: tuple());
C = foreach A generate nodes.$0;
dump C;

Вывод я получаю:

(1)
(2)
...