如何在 Pig 中解析 JSON?

发布于 2024-10-17 12:11:33 字数 581 浏览 6 评论 0原文

我在 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(7

偏爱自由 2024-10-24 12:11:33

Pig 0.10 带有内置的 JsonStorage 和 JsonLoader()。

用于 json 加载/存储的 Pig 文档

Pig 0.10 comes with builtin JsonStorage and JsonLoader().

pig doc for json load/store

不如归去 2024-10-24 12:11:33

经过大量的解决方法和解决问题后,我能够回答以完成此任务。我在我的博客上写了一篇关于如何做到这一点的文章。它可以在这里找到: 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/

月野兔 2024-10-24 12:11:33

Pig 带有一个 JSON 加载器。
要加载您使用:

A = 加载'data.json'
使用 PigJsonLoader();

要存储您可以使用:

STORE INTO ‘output.json’ 
    USING PigJsonLoader();

但是,我不确定它支持 GZIPed 数据....

Pig comes with a JSON loader.
To load you use:

A = LOAD ‘data.json’
USING PigJsonLoader();

To store you can use:

STORE INTO ‘output.json’ 
    USING PigJsonLoader();

However, I'm not sure it supports GZIPed data....

℉絮湮 2024-10-24 12:11:33

我们可以通过使用 JsonLoader 来做到这一点...但是我们必须提及 json 数据的架构,否则可能会出现错误..只需按照以下链接操作

         http://joshualande.com/read-write-json-apache-pig/

我们也可以通过创建 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

         http://joshualande.com/read-write-json-apache-pig/

We can also do it by creating UDF to parse it...

魂ガ小子 2024-10-24 12:11:33

您可以尝试使用 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');

空气里的味道 2024-10-24 12:11:33

我看到 twitterelephantbird 的使用量增加了很多,并且它很快成为 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;

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 :

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;
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文