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

Posted

技术标签:

【中文标题】用大象鸟加载嵌套的json后如何查询它【英文标题】:How do I query a nested json after loading it with elephant bird 【发布时间】:2013-10-23 15:06:24 【问题描述】:

我对 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"]]

我使用大象鸟加载所有 json 文件:

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

到目前为止,唯一对我有用的是查询返回字节数组的“名称”字段。

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 等的。

我该怎么做?

一个代码示例会很有帮助,因为我已经用谷歌搜索了很多。

谢谢

【问题讨论】:

【参考方案1】:

试试这个

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

【讨论】:

【参考方案2】:

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

DESCRIBE data;

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

【讨论】:

感谢您的回答。在这里询问之前已经尝试过,信息不足。数据:json: map[]

以上是关于用大象鸟加载嵌套的json后如何查询它的主要内容,如果未能解决你的问题,请参考以下文章

在猪 0.16 中加载 json 数据时,大象鸟不存在错误

使用大象鸟罐子的猪 JsonLoader() 处理 twitter 的复杂 json 对象时出错

尝试使用 LzoPigStorage 和大象鸟加载索引 LZO 文件

如何基于相等性检查在 Spark 中使用内部数组查询嵌套 json

thinkphp如何使用快递鸟-查看快递物流查询api接口

为啥大象鸟猪 JsonLoader 只处理我的文件的一部分?