加载原始JSON成猪(Loading Raw JSON into Pig)

2019-08-01 01:28发布

我有一个文件,其中每一行是一个JSON对象(实际上,这是计算器的转储)。 我想这个尽可能容易地加载到Apache的猪,但我有麻烦搞清楚我怎么能告诉猪的输入格式是什么。 下面是一个入门的例子,

{ 
"_id" : { "$oid" : "506492073401d91fa7fdffbe" }, 
"Body" : "....", 
"ViewCount" : 7351, 
"LastEditorDisplayName" : "Rich B", 
"Title" : ".....", 
"LastEditorUserId" : 140328, 
"LastActivityDate" : { "$date" : 1314819738077 }, 
"LastEditDate" : { "$date" : 1313882544213 }, 
"AnswerCount" : 12, "CommentCount" : 19, 
"AcceptedAnswerId" : 7, 
"Score" : 83, 
"PostTypeId" : "question", 
"OwnerUserId" : 8, 
"Tags" : [ "c#", "winforms" ], 
"CreationDate" : { "$date" : 1217540572667 }, 
"FavoriteCount" : 13, "Id" : 4, 
"ForumName" : "stackoverflow.com" 
}

有没有一种方法我可以加载一个文件,其中每一行是到上述猪之一,而不必指定手工模式? 或者一个方法来自动生成基于所有对象中观察到的(可能是嵌套)键模式? 如果我需要指定手工模式,将模式串是什么样子?

谢谢!

Answer 1:

快速和简单的方法:使用Twitter的elephantbird项目。 里面是一个叫做装载机com.twitter.elephantbird.pig.load.JsonLoader 。 使用时直接像这样,

A = LOAD '/path/to/data.json' USING com.twitter.elephantbird.pig.load.JsonLoader() as (json:map[]);
B = FOREACH A GENERATE json#'fieldName' AS field_name;

嵌套的元素将不被加载。 然而,你可以很容易地解决这个问题(如果需要),改成,

A = LOAD '/path/to/data.json' USING com.twitter.elephantbird.pig.load.JsonLoader('-nestedLoad')

包括elephantbird容易-只需拉项目“elephantbird”与组织“com.twitter.elephantbird”使用Maven(或等同的)依赖管理器,然后发出平常register猪命令

register 'lib/elephantbird.jar';


文章来源: Loading Raw JSON into Pig