我在s3中有很多gzip的日志文件,它们有3种类型的日志行:b,c,i。我和c都是单级json:
{"this":"that","test":"4"}
类型b是深层嵌套的json。我偶然发现这个gist正在讨论编译一个罐子来使这个工作。由于我的java技能不是很好,我真的不知道该怎么做。
{"this":{"foo":"bar","baz":{"test":"me"},"total":"5"}}
由于类型i和c并不总是以相同的顺序,这使得生成正则表达式中的所有内容变得困难。使用Pig可以处理JSON(在gzip文件中)吗?我正在使用任何版本的Pig来自Amazon Elastic Map Reduce实例。
这归结为两个问题: 1)我可以用猪解析JSON(如果是,如何)? 2)如果我可以解析JSON(来自gzip的日志文件),我可以解析嵌套的JSON对象吗?
答案 0 :(得分:16)
Pig 0.10内置Json Storage和JsonLoader()。
答案 1 :(得分:8)
经过大量的变通办法和完成工作后,我能够回答这个问题。我在博客上写了一篇关于如何做到这一点的文章。它可以在这里找到:http://eric.lubow.org/2011/hadoop/pig-queries-parsing-json-on-amazons-elastic-map-reduce-using-s3-data/
答案 2 :(得分:5)
Pig附带一个JSON加载器。 要加载你使用:
A = LOAD'data.json'
使用PigJsonLoader();
要存储,您可以使用:
STORE INTO ‘output.json’
USING PigJsonLoader();
但是,我不确定它是否支持GZIPed数据......
答案 3 :(得分:3)
答案 4 :(得分:2)
我们可以通过使用JsonLoader来实现...但我们必须提到您的json数据的架构,否则可能会出现错误..请按照以下链接
http://joshualande.com/read-write-json-apache-pig/
我们也可以通过创建UDF来解析它...
答案 5 :(得分:0)
我已经看到twitter elephantbird的使用量增加了很多,它很快就成为了PIG中json解析的goto库。
示例:
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;