我在一个文件中有一些包含多个JSON对象的源数据。在对象之间没有回车符,如果我手动添加回车符,则Pig 0.11.1 JSONLoader将分别加载每个对象,并且我在Pig中获得预期的元组。没有回车符,它只会加载文件中的第一个JSON对象。
有没有办法直接使用JSONLoader加载文件中的每个对象而无需预处理?
如果无法做出任何建议,可以轻松预处理文件以添加回车(理想情况下使用Pig)?
以下是文件中JSON的示例:
{"values":{"x":447100,"y":0},"key":"rpi/SBS_01"}
{"values" {"x":454663,"y":154},"key":"rpi/SBS_01"}
{"values":{"x":455100,"y":0},"key":"rpi/SBS_01"}
{"values":{"x":456100,"y":0},"key":"rpi/SBS_01"}
{"values":{"x":457100,"y":0},"key":"rpi/SBS_01"}
我的源数据位于S3存储桶中,我正在使用ElasticMapReduce运行我的Pig作业。
目前的猪脚本:
a = load '$INPUT' using JsonLoader('values:(x:long,y:int),sbsid:chararray');
b = foreach a generate values.x, values.y, sbsid;
c = filter b by $1 > 0;
d = distinct c;
e = order d by $0 asc;
store d into '$OUTPUT' using PigStorage('|');
答案 0 :(得分:0)
您的JSON格式不正确;它需要被格式化为一个数组(注意开头方括号和逗号分隔键:值"词典":
[
{"values":{"x":447100,"y":0},"key":"rpi/SBS_01"},
{"values":{"x":454663,"y":154},"key":"rpi/SBS_01"},
{"values":{"x":455100,"y":0},"key":"rpi/SBS_01"},
{"values":{"x":456100,"y":0},"key":"rpi/SBS_01"},
{"values":{"x":457100,"y":0},"key":"rpi/SBS_01"}
]
您可以使用JSONLint之类的工具来验证您的JSON。
编辑:请注意,您还错过了"值"之间的冒号。和下一个{在你的第二行。