PIG Загрузка CSV - Ошибка типа карты

Мы стремимся использовать PIG для крупномасштабного анализа журналов журналов наших серверов. Мне нужно загрузить тип данных карты PIG из файла.

Я попытался запустить образец сценария PIG со следующими данными.

Строка в моем CSV-файле с именем 'test' (для обработки PIG) выглядит так:

151364,[ref#R813,highway#secondary]

Мой сценарий PIG

a = LOAD 'test' using PigStorage(',') AS  (id:INT, m:MAP[]);
DUMP a;

Идея состоит в том, чтобы загрузить int и второй элемент как хэш-карту. Однако, когда я сбрасываю, поле int анализируется правильно (и печатается в дампе), но поле карты не анализируется, что приводит к ошибке синтаксического анализа.

Может кто-нибудь объяснить, если мне что-то не хватает?


person Jagadish    schedule 30.08.2012    source источник


Ответы (2)


Я думаю, что существует проблема, связанная с разделителем (например, разделитель полей каким-то образом влияет на синтаксический анализ поля карты или его путают с разделителем карты).

Когда используются эти входные данные (обратите внимание, я использовал точку с запятой в качестве разделителя полей):

151364;[ref#R813,highway#secondary]

ниже вывод моей оболочки grunt:

grunt> a = LOAD '/tmp/temp2.txt' using PigStorage(';') AS (id:int, m:[]);
grunt> dump a;
...
(151364,[highway#secondary,ref#R813])

grunt> b = foreach a generate m#'ref'; 
grunt> dump b;
(R813)
person Cihan Keser    schedule 31.08.2012

Атласт, в проблеме разобрался. Просто измените ограничитель с ',' на другой символ, например трубу. Разделитель полей путали с разделителем ',', используемым для карты :)

The string 151364,[ref#R813,highway#secondary] was getting parsed into,
field1: 151364  field2: [ref#R813  field3: highway#secondary]
Since '[ref#$813' is not a valid map field, there is a parse error.

Я также просмотрел исходный код функции PigStorage и подтвердил логику синтаксического анализа - Исходный код

@Override
public Tuple getNext() throws IOException {
        for (int i = 0; i < len; i++) {
            //skipping some stuff
            if (buf[i] == fieldDel) { // if we find delim
                readField(buf, start, i); //extract field from prev delim to current
                start = i + 1;
                fieldID++;
            }
        }
 }

Таким образом, поскольку PIG разделяет поля по разделителю, это приводит к путанице синтаксического анализа полей с разделителем, используемым для карты.

person Jagadish    schedule 31.08.2012