如何在 Pig 中解析 JSON?
我在 s3 中有很多经过 gzip 压缩的日志文件,其中有 3 种类型的日志行:b、c、i。 i 和 c 都是单层 json:
{"this":"that","test":"4"}
类型 b 是深度嵌套的 json。我遇到了这个 gist 谈论编译一个 jar 来完成这项工作。由于我的 java 技能不太好,所以我真的不知道接下来该怎么做。
{"this":{"foo":"bar","baz":{"test":"me"},"total":"5"}}
由于类型 i 和 c 的顺序并不总是相同,这使得在生成正则表达式中指定所有内容变得困难。 Pig 可以处理 JSON(在 gzip 文件中)吗?我正在使用基于 Amazon Elastic Map Reduce 实例构建的 Pig 版本。
这归结为两个问题: 1)我可以用 Pig 解析 JSON(如果可以,如何解析)? 2) 如果我可以解析 JSON(来自 gzip 日志文件),我可以解析嵌套的 JSON 对象吗?
I have a lot of gzip'd log files in s3 that has 3 types of log lines: b,c,i. i and c are both single level json:
{"this":"that","test":"4"}
Type b is deeply nested json. I came across this gist talking about compiling a jar to make this work. Since my java skills are less than stellar, I didn't really know what to do from here.
{"this":{"foo":"bar","baz":{"test":"me"},"total":"5"}}
Since types i and c are not always in the same order, this makes specifying everything in the generate regex difficult. Is handling JSON (in a gzip'd file) possible with Pig? I am using whichever version of Pig comes built on an Amazon Elastic Map Reduce instance.
This boils down to two questions:
1) Can I parse JSON with Pig (and if so, how)?
2) If I can parse JSON (from a gzip'd logfile), can I parse nested JSON objects?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(7)
Pig 0.10 带有内置的 JsonStorage 和 JsonLoader()。
用于 json 加载/存储的 Pig 文档
Pig 0.10 comes with builtin JsonStorage and JsonLoader().
pig doc for json load/store
经过大量的解决方法和解决问题后,我能够回答以完成此任务。我在我的博客上写了一篇关于如何做到这一点的文章。它可以在这里找到: http://eric.lubow.org/2011/hadoop/pig-queries-parsing-json-on-amazons-elastic-map-reduce-using-s3-data/
After a lot of workarounds and working through things, I was able to answer to get this done. I did a write-up about it on my blog about how to do this. It is available here: http://eric.lubow.org/2011/hadoop/pig-queries-parsing-json-on-amazons-elastic-map-reduce-using-s3-data/
Pig 带有一个 JSON 加载器。
要加载您使用:
要存储您可以使用:
但是,我不确定它支持 GZIPed 数据....
Pig comes with a JSON loader.
To load you use:
To store you can use:
However, I'm not sure it supports GZIPed data....
请尝试以下操作:https://github.com/ab/elephant-bird
Please try this: https://github.com/a-b/elephant-bird
我们可以通过使用 JsonLoader 来做到这一点...但是我们必须提及 json 数据的架构,否则可能会出现错误..只需按照以下链接操作
我们也可以通过创建 UDF 来解析它来做到这一点...
We can do it by using JsonLoader...But we have to mention the schema for your json data or else it may arise an error..just follow the below link
We can also do it by creating UDF to parse it...
您可以尝试使用 twitterelephantbird json 加载器,它动态处理 json 数据。但是您必须对架构非常精确。
api_data = LOAD '文件名' 使用 com.twitter.elephantbird.pig.load.JsonLoader('-nestedLoad');
You can try usin the twitter elephantbird json loader , It handles the json data dynamically.But you have to be very precise with the schema .
api_data = LOAD 'file name' USING com.twitter.elephantbird.pig.load.JsonLoader('-nestedLoad');
我看到 twitterelephantbird 的使用量增加了很多,并且它很快成为 PIG 中 json 解析的 goto 库。
例子 :
I have seen the usage of twitter elephantbird increase a lot and it is quickly becoming the goto library for json parsing in PIG.
Example :