2

問題: ApacheWebサーバーのログエントリを含むファイルが多数あります。これらのエントリは日時順になっておらず、ファイル全体に散在しています。Pigを使用して、1日分のファイルを読み取り、ログエントリを日時順にグループ化して並べ替え、そこに含まれるエントリの日時にちなんで名付けられたファイルに書き込みます。

セットアップ: ファイルをインポートしたら、正規表現を使用して日付フィールドを取得し、それを時間に切り捨てます。これにより、あるフィールドにレコードがあり、別のフィールドに日付が切り捨てられたセットが生成されます。ここから、日時フィールドでグループ化します。

最初の試み: 私の最初の考えは、FOREACHを使用してグループを反復処理しているときに、STOREコマンドを使用することでしたが、Pigではクールではないことがすぐにわかりました。

2番目の試み: 2番目の試みは、貯金箱でMultiStorage()メソッドを使用することでした。これは、ファイルを確認するまではうまく機能しました。問題は、MulitStorageが、グループ化に使用したフィールドを含め、すべてのフィールドをファイルに書き込みたいということです。私が本当に欲しいのは、ファイルに書き込まれた元のレコードだけです。

質問: それで...私はそれが意図されていない何かのためにPigを使用していますか、それともPigを使用してこの問題に取り組むためのより良い方法がありますか?この質問があるので、簡単なコード例を使用して、問題をさらに説明します。入手したら、ここに投稿します。前もって感謝します。

4

1 に答える 1

2

そのままでは、Pig には多くの機能がありません。それは基本的なことを行いますが、95% のフォームから 100% のフォームを取得するために、カスタム UDF を作成したり、ロード/ストア関数を作成したりする必要があることに気付くことがよくあります。小さなストア関数を書くだけでも、MapReduce プログラム全体よりもはるかに少ない Java であるため、通常はそれだけの価値があると思います。

あなたの 2 回目の試みは、私がやろうとしていることに非常に近いものです。ソースコードをコピーして貼り付けるか、MultiStorage継承を出発点として使用する必要があります。次に、putNextメソッドを変更してグループ値を取り除きますが、そのファイルには引き続き書き込みます。残念ながらorメソッドTupleがないので、タプル全体を書き直す必要があります。または、元の文字列しかない場合は、それを取り出して、.removedeleteTuple

もう少しヘルプが必要な場合に備えて、Load/Store 関数の記述に関する一般的なドキュメント: http://pig.apache.org/docs/r0.10.0/udf.html#load-store-functions

于 2012-05-01T01:15:24.647 に答える