2011-02-16 23 views
19

我有很多gzip'd日志文件在s3中有3种类型的日志行:b,c,i。我和c都是单级json:如何解析Pig中的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)我可以用Pig解析JSON吗?如果是,如何? 2)如果我可以解析JSON(从gzip'd日志文件),我可以解析嵌套的JSON对象吗?

回答

5

猪自带JSON加载程序。 要加载使用:

A = LOAD“data.json”
USING PigJsonLoader();

要存储,您可以使用:

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

但是,我不知道它支持GZIPed数据....

+3

其中/是什么版本? 0.8.0似乎并不知道它默认情况下。 – ayman 2011-03-01 01:47:37

+1

PigJsonLoader似乎是一个单独的包? https://开头github上。com/mmay/PigJsonLoader – 2012-01-04 18:45:55

2

我们可以通过使用JsonLoader做到这一点......但是,我们不得不提到的模式为您的JSON数据,否则它可能会出现一个error..just按照下面的链接

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

我们也可以通过创建UDF来解析它...

0

您可以尝试使用twitter elephantbird json loader,它动态处理json数据。但是您必须对模式非常精确。

api_data = LOAD'文件名'USING com.twitter.elephantbird.pig.load.JsonLoader(' - nestedLoad');

0

我已经看到twitter elephantbird的使用增加了很多,它很快成为json在PIG中解析的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;