Как загрузить файл с массивом JSON на строку в Pig Latin
Существующий скрипт создает текстовые файлы с массивом объектов JSON на строку, например,
[{"foo":1,"bar":2},{"foo":3,"bar":4}]
[{"foo":5,"bar":6},{"foo":7,"bar":8},{"foo":9,"bar":0}]
…
Я хотел бы загрузить эти данные в Pig, взорвав массивы и обработав каждый отдельный объект.
Я смотрел на использование JsonLoader в Twitter Elephant Bird безрезультатно. Он не жалуется на JSON, но я получаю "Успешно прочитано 0 записей" при выполнении следующего:
register '/tmp/elephant-bird/core/target/elephant-bird-core-4.3-SNAPSHOT.jar';
register '/tmp/elephant-bird/hadoop-compat/target/elephant-bird-hadoop-compat-4.3-SNAPSHOT.jar';
register '/tmp/elephant-bird/pig/target/elephant-bird-pig-4.3-SNAPSHOT.jar';
register '/usr/local/lib/json-simple-1.1.1.jar';
a = load '/path/to/file.json' using com.twitter.elephantbird.pig.load.JsonLoader('-nestedLoad=true');
dump a;
Я также пытался загрузить файл как обычно, обрабатывая каждую строку как содержащую один столбец chararray, а затем пытаясь проанализировать его как JSON, но я не могу найти уже существующий UDF, который, кажется, делает свое дело.
Есть идеи?
1 ответ
Решение
Как сказал Дональд, вы должны использовать UDF здесь. Здесь, в Xplenty, мы написали JsonStringToBag для дополнения JsonStringToMap от ElephantBird.