用大象鸟加载嵌套的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后如何查询它的主要内容,如果未能解决你的问题,请参考以下文章
使用大象鸟罐子的猪 JsonLoader() 处理 twitter 的复杂 json 对象时出错
尝试使用 LzoPigStorage 和大象鸟加载索引 LZO 文件