如何在加载大象鸟后查询嵌套的json

时间:2013-10-23 15:06:25

标签: json hadoop apache-pig elephantbird

我对HADOOP和猪很新。

所以。我有一行json文件,都有相同的架构:

{"name":"someName","pkg":[{"F1":"abc","F2":"44","F3":"xyz","F4":1024,"info":
[{"timestamp":1372631550000,"value":"122","id":"nnn","name":"ppp"}, 
{"timestamp":1372649240000,"value":"222","id":"ggg","name":"qqq"}]} ,
{"F1":"abc","f2":"44","F3":"xyz","F4":1024,"new":[{"type":"event1", "time":1372537000000,"more":"
{\"bbad\":\"HELLO\",\"is_done\":0,\"ssss\":-128}"}]}]}

我使用elephantbird加载所有json文件:

data = LOAD 'browsers/gzip' USING com.twitter.elephantbird.pig.load.JsonLoader('-nestedLoad') as (json:map[]);

到目前为止,唯一对我有用的是查询返回bytearray的“name”字段。

b = foreach data generate json#'name' as name

然后我尝试将其转换为地图:

c = FOREACH data GENERATE json#'name' as (m:map[]);
DESCRIBE c;

并获取

c:{tuple_0:(m:map [])}

,数据如下:

({([F1# “ABC”,F2#44 ...])})

所以现在我需要过滤掉所有pkg.F1 =“abc”或者所有pkg.info.value = 122等的。

我该怎么做?

一个代码示例将非常有用,因为我已经搜索了很多。

由于

2 个答案:

答案 0 :(得分:1)

试试这个

c = FOREACH data GENERATE flatten(json#'name') as (m:map[]);

答案 1 :(得分:-1)

问题在于您不知道Pig中数据的组织方式。使用

DESCRIBE data;

找出JsonLoader返回的结构是什么,这应该为您提供有关如何提取数据的足够信息。