2012-09-28 109 views
4

我有一個文件,每一行都是一個JSON對象(實際上,它是一個stackoverflow轉儲)。我想盡可能輕鬆地將它加載到Apache Pig中,但我無法弄清楚如何告訴Pig輸入格式是什麼。下面是一個入門的例子,將原始JSON加載到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" 
} 

有沒有一種方法我可以加載一個文件,其中每行是到上述豬一個,而不必指定手工模式?或者也許是一種基於所有對象中觀察到的(可能嵌套的)鍵自動生成模式的方法?如果我確實需要手動指定模式,那麼模式字符串會是什麼樣子?

謝謝!

回答

10

快速簡單的方法:使用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'; 
+0

我在哪裏可以找到象鳥的Javadoc?谷歌搜索沒有返回任何。 –

+0

你可能想看看[在他們的github倉庫中JsonLoader的源代碼。](https://github.com/twitter/elephant-bird/blob/master/pig/src/main/java/com/twitter/ elephantbird /豬/加載/ JsonLoader.java) – Eyal