Как разобрать 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?
Ответы
Ответ 1
После множества обходных решений и работы над вещами я смог ответить, чтобы это сделать. Я написал об этом в своем блоге о том, как это сделать. Он доступен здесь: http://eric.lubow.org/2011/hadoop/pig-queries-parsing-json-on-amazons-elastic-map-reduce-using-s3-data/
Ответ 2
Свинья 0.10 поставляется со встроенными JsonStorage и JsonLoader().
свиной док для загрузки/хранения json
Ответ 3
Свинья поставляется с загрузчиком JSON.
Для загрузки вы используете:
A = LOAD 'data.json
ИСПОЛЬЗОВАНИЕ PigJsonLoader();
Для сохранения вы можете использовать:
STORE INTO ‘output.json’
USING PigJsonLoader();
Однако я не уверен, что он поддерживает данные GZIPed....
Ответ 4
Попробуйте следующее: https://github.com/a-b/elephant-bird
Ответ 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;