5

各行が 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" 
}

手動でスキーマを指定することなく、各行が上記のいずれかであるファイルを Pig にロードする方法はありますか? それとも、すべてのオブジェクトで観察された (おそらくネストされた) キーに基づいてスキーマを自動的に生成する方法でしょうか? スキーマを手動で指定する必要がある場合、スキーマ文字列はどのようになりますか?

ありがとう!

4

1 に答える 1

11

手っ取り早く簡単な方法は、Twitter のエレファントバード プロジェクトを使用することです。内部には と呼ばれるローダーがあり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')

エレファントバードを含めるのは簡単です。Maven (または同等の) 依存関係マネージャーを使用して、組織「com.twitter.elephantbird」でプロジェクト「elephant-bird」をプルし、通常のregisterコマンドを pig で発行するだけです。

register 'lib/elephantbird.jar';
于 2012-10-10T22:35:32.370 に答える