Подтвердить что ты не робот

Как разобрать JSON в Pig?

У меня есть много файлов журнала gzip'd в s3, у которых есть 3 типа строк журнала: b, c, i. я и c являются одноуровневыми json:

{"this":"that","test":"4"}

Тип b глубоко вложен json. Я столкнулся с этим gist, говорящим о компиляции банку, чтобы сделать эту работу. Поскольку мои навыки java меньше звездного, я действительно не знал, что делать дальше.

{"this":{"foo":"bar","baz":{"test":"me"},"total":"5"}}

Так как типы я и c не всегда находятся в одном порядке, это затрудняет определение всего в выражении regex. Является ли обработка JSON (в файле gzip'd) возможной с помощью Pig? Я использую ту, какая версия свиньи построена на экземпляре Amazon Elastic Map Reduce.

Это сводится к двум вопросам: 1) Могу ли я разобрать JSON с Pig (и если да, то как)? 2) Если я могу разобрать JSON (из файла журнала gzip'd), могу ли я разобрать вложенные объекты JSON?

4b9b3361

Ответ 3

Свинья поставляется с загрузчиком JSON. Для загрузки вы используете:

A = LOAD 'data.json
    ИСПОЛЬЗОВАНИЕ PigJsonLoader();

Для сохранения вы можете использовать:

STORE INTO ‘output.json’ 
    USING PigJsonLoader();

Однако я не уверен, что он поддерживает данные GZIPed....

Ответ 5

Мы можем сделать это с помощью JsonLoader... Но мы должны упомянуть схему для ваших json-данных, иначе это может привести к ошибке. Просто следуйте приведенной ниже ссылке

         http://joshualande.com/read-write-json-apache-pig/

Мы также можем сделать это, создав UDF для его анализа...

Ответ 6

Вы можете попробовать использовать jitter-загрузчик twitter elephantbird, он обрабатывает данные json динамически. Но вы должны быть очень точными со схемой.

api_data = LOAD 'имя файла' USING com.twitter.elephantbird.pig.load.JsonLoader('- nestedLoad');

Ответ 7

Я видел, как использование twitter elephantbird много возрастает, и оно быстро становится библиотекой goto для разбора json в PIG.

Пример:

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

JsonInput = LOAD 'input_path' USING TwitterJsonLoader() AS (entity: map[]);

InputObjects = FOREACH JsonInput GENERATE (map[]) entity#'Object' AS   JsonObject;

InputIds = FOREACH InputObjects GENERATE JsonObject#'id' AS id;