如何在 Pig 中从 json 中加载 json 和 value?
Posted
技术标签:
【中文标题】如何在 Pig 中从 json 中加载 json 和 value?【英文标题】:How to load json and value out of json in Pig? 【发布时间】:2018-05-11 18:27:43 【问题描述】:我有一个json和json中的值
000000,"000":"phoneNumber":null,"firstName":"xyz","lastName":"pqr","email":"email@xyz.com","alternatePickup":true ,"sendTextNotification":false,"isSendTextNotification":false,"isAlternatePickup":true
我正在尝试使用大象鸟 json 加载器将这个 json 加载到猪中,但无法做到。 我可以加载以下 json
"000":"phoneNumber":null,"firstName":"xyz","lastName":"pqr","email":"email@xyz.com","alternatePickup":true," sendTextNotification":false,"isSendTextNotification":false,"isAlternatePickup":true
使用以下脚本 -
REGISTER json-simple-1.1.1.jar;
REGISTER elephant-bird-pig-4.3.jar;
REGISTER elephant-bird-hadoop-compat-4.3.jar;
json_data = load 'ek.json' using com.twitter.elephantbird.pig.load.JsonLoader() AS (json_key: [(phoneNumber:chararray,firstName:chararray,lastName:chararray,email:chararray,alternatePickup:boolean,sendTextNotification:boolean,isSendTextNotification:boolean,isAlternatePickup:boolean)]);
dump json_data;
但是当我从 json 中包含值时
json_data = load 'ek.json' using com.twitter.elephantbird.pig.load.JsonLoader() AS (id:int,json_key: [(phoneNumber:chararray,firstName:chararray,lastName:chararray,email:chararray,alternatePickup:boolean,sendTextNotification:boolean,isSendTextNotification:boolean,isAlternatePickup:boolean)]);
它不工作!提前感谢您的帮助。
【问题讨论】:
【参考方案1】:JsonLoader
只允许加载正确的 json,而您的格式实际上是 CSV
。您可以按照复杂度的顺序排列三个选项:
-
调整您的输入格式并将 id 作为其中的一部分
以 CSV 格式加载数据(作为 2 个字段:id 和 json,然后使用自定义 UDF 将 json 字段解析为元组)
编写允许您使用原始格式的自定义加载程序。
【讨论】:
【参考方案2】:你可以使用内置的 JsonStorage 和 JsonLoader()
a = load 'a.json' using JsonLoader('a0:int,a1:(a10:int,a11:chararray),a2:(a20:double,a21:bytearray),a3:[chararray]');
在这个例子中,数据是在没有模式的情况下加载的;它假定输入目录中有一个 .pig_schema(由 JsonStorage 生成)。
a = load 'a.json' using JsonLoader();
【讨论】:
以上是关于如何在 Pig 中从 json 中加载 json 和 value?的主要内容,如果未能解决你的问题,请参考以下文章
在 Hortonworks Sandbox 内的 Pig 脚本中加载 JSON 文件