S3には、b、c、iの3種類のログ行を持つgzip圧縮されたログファイルがたくさんあります。 iとcは両方ともシングルレベルのjsonです:
{"this":"that","test":"4"}
タイプbは深くネストされたjsonです。私はこれに出くわしました 要点 これを機能させるためにjarをコンパイルすることについて話しました。私のJavaスキルは恒星に満たないので、ここから何をすべきか本当にわかりませんでした。
{"this":{"foo":"bar","baz":{"test":"me"},"total":"5"}}
タイプiとタイプcは常に同じ順序であるとは限らないため、生成正規表現ですべてを指定することは困難です。 Pigで(gzipされたファイルで)JSONを処理することは可能ですか? Amazon Elastic MapReduceインスタンス上に構築されたPigのバージョンを使用しています。
これは2つの質問に要約されます:1)PigでJSONを解析できますか(もしそうなら、どのように)? 2)(gzipで圧縮されたログファイルから)JSONを解析できる場合、ネストされたJSONオブジェクトを解析できますか?
多くの回避策と作業を行った後、私はこれを成し遂げるために答えることができました。私はこれを行う方法について私のブログにそれについての記事を書きました。ここから入手できます: http://eric.lubow.org/2011/hadoop/pig-queries-parsing-json-on-amazons-elastic-map-reduce-using-s3-data/
Pig 0.10には、Json StorageとJsonLoader()が組み込まれています。
PigにはJSONローダーが付属しています。ロードするには、次を使用します。
A = LOAD「data.json」
PigJsonLoader();の使用
保存するには、次を使用できます。
STORE INTO ‘output.json’
USING PigJsonLoader();
ただし、GZIPされたデータをサポートしているかどうかはわかりません。
これを試してください: https://github.com/a-b/elephant-bird
JsonLoaderを使用してそれを行うことができます...しかし、jsonデータのスキーマについて言及する必要があります。そうしないと、エラーが発生する可能性があります。以下のリンクをたどってください。
http://joshualande.com/read-write-json-Apache-pig/
UDFを作成して解析することでもできます...
Twitterのelephantbirdの使用が大幅に増加し、PIGでのjson解析のgotoライブラリになりつつあります。
例:
DEFINE TwitterJsonLoader com.Twitter.elephantbird.pig.load.JsonLoader('-nestedLoad=true ');
JsonInput = LOAD 'input_path' USING TwitterJsonLoader() AS (entity: map[]);
InputObjects = FOREACH JsonInput GENERATE (map[]) entity#'Object' AS JsonObject;
InputIds = FOREACH InputObjects GENERATE JsonObject#'id' AS id;
Twitterのelephantbirdjsonローダーで試してみることができます。jsonデータを動的に処理します。ただし、スキーマは非常に正確である必要があります。
api_data = LOAD 'ファイル名' USING com.Twitter.elephantbird.pig.load.JsonLoader( '-nestedLoad');