Обработка полей JSON Array в UDF Elephant-Bird в PIG - PullRequest
1 голос
/ 24 марта 2012

Быстрый вопрос по обработке JSON в PIG.

Я попробовал какой-то JsonLoader под названием Elephant-Bird, чтобы загрузить и обработать данные JSON, как показано ниже:

{
   "SV":1,
   "AD":[
      {
         "ID":"46931606",
         "C1":"46",
         "C2":"469",
         "ST":"46931",
         "PO":1
      },
      {
         "ID":"46721489",
         "C1":"46",
         "C2":"467",
         "ST":"46721",
         "PO":5
      }
   ]
}

Загрузчик хорошо работает для простых полей, но не работает для любого поля массива. Я не знаю, как я могу получить доступ к элементам в массиве (поле "AD" выше) с этим UDF или любым другим способом? Пожалуйста, порекомендуйте.

Ответы [ 3 ]

3 голосов
/ 06 сентября 2013

Вы должны использовать параметр -nestedLoad следующим образом:

a = load 'input' using com.twitter.elephantbird.pig.load.JsonLoader('-nestedLoad') AS (json:map[]).

И тогда вы используете следующий код:

b = FOREACH a GENERATE (json#'AD') as AD:bag{t:Tuple(m:map[])};

Тогда ваш массив json станет типом пакета. Вы можете расплющить его, чтобы получить кортеж.

c = FOREACH b GENERATE FLATTEN(AD);
d = FOREACH c GENERATE AD::m#ID AS ID, AD::m#C1 AS C1, AD::m#C2 AS C2, AD::m#ST AS ST, AD::m#PO AS PO

В это время вы получите тип данных кортежа, которым является схема (ID: bytearray, C)

0 голосов
/ 27 марта 2015

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

REGISTER elephant-bird-core-4.3.jar;
REGISTER elephant-bird-hadoop-compat-4.5.jar;
REGISTER elephant-bird-pig-4.5.jar;

DEFINE JsonLoader com.twitter.elephantbird.pig.load.JsonLoader('-nestedLoad=true');

records = LOAD '$DATA_PATH' USING JsonLoader() AS (data: map[]);
records = FOREACH records GENERATE 
                                data#'SV' AS SV,
                                FLATTEN(data#'AD') AS AD;
records = FOREACH records GENERATE
                                SV,
                                AD#'ID' AS ID,
                                AD#'C1' AS C1,
                                AD#'C2' AS C2,
                                AD#'ST' AS ST,
                                AD#'PO' AS PO;
0 голосов
/ 18 июля 2012

Я думаю, что часть массива возвращается как мешок с птицей-слоном JsonLoader.

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

...