如何在用elephant bird加载嵌套的json之后查询它

gkl3eglg  于 2021-06-03  发布在  Hadoop
关注(0)|答案(2)|浏览(283)

我是hadoop和pig的新手。
所以。我有一行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

然后我尝试将其转换为Map:

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

然后得到
c:{元组0:(m:map[])}
数据如下:
({([f1#“”,f2#44…])})
所以现在我需要过滤所有的pkg.f1=“”或者所有的pkg.info.value=122等等。
我该怎么做?
一个代码示例将非常有用,因为我已经在google上搜索了很多。
谢谢

sq1bmfud

sq1bmfud1#

试试这个

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

rqqzpn5f2#

问题是你不知道你的数据是如何组织在Pig。使用

DESCRIBE data;

找出结构返回的内容 JsonLoader 是的,这将为您提供有关如何提取数据的足够信息。

相关问题