我有一个文件,其中每一行都是一个JSON对象(实际上,它是stackoverflow的转储)。我想尽可能轻松地将它加载到Apache Pig中,但我无法弄清楚如何告诉Pig输入格式是什么。这是一个条目的例子,
{
"_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"
}
有没有办法可以加载一个文件,其中每行都是上面的一个,而不必手工指定架构?或者也许是一种基于所有对象中观察到的(可能是嵌套的)键自动生成模式的方法?如果我确实需要手动指定架构,架构字符串会是什么样的?
谢谢!
答案 0 :(得分:10)
快速简便的方法:使用Twitter的大象项目。 Inside是一个名为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很容易 - 只需拉动项目" elephant-bird"与组织" com.twitter.elephantbird"使用Maven(或等效的)依赖管理器,然后在pig中发出通常的register
命令
register 'lib/elephantbird.jar';