如何在Pig Latin中每行加载一个带JSON数组的文件

时间:2013-11-08 16:12:44

标签: hadoop apache-pig elephantbird

现有脚本每行创建一个包含JSON对象数组的文本文件,例如

[{"foo":1,"bar":2},{"foo":3,"bar":4}]
[{"foo":5,"bar":6},{"foo":7,"bar":8},{"foo":9,"bar":0}]
…

我想在Pig中加载这些数据,爆炸数组并处理每个单独的对象。

我已经看过在Twitter的Elephant Bird中使用JsonLoader无济于事。它没有抱怨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 个答案:

答案 0 :(得分:1)

像唐纳德说的那样,你应该在这里使用UDF。在Xplenty中,我们编写了JsonStringToBag来补充ElephantBird的JsonStringToMap。