0

私は現在、次の豚のスクリプトを持っています(簡潔にするために列リストは切り捨てられています):

REGISTER /usr/lib/pig/piggybank.jar;

inputData = LOAD '/data/$date*.{bz2,bz,gz}' USING PigStorage('\\x7F')
PigStorage('\\x7F')
AS (
SITE_ID_COL                 :int,--                     = Item Site ID
META_ID_COL                 :int,--                 = Top Level (meta) category ID
EXTRACT_DATE_COL            :chararray,--          = Date for the data points
...
)

SPLIT inputData INTO site0 IF (SITE_ID_COL == 0), site3 IF (SITE_ID_COL == 3), site15 IF (SITE_ID_COL == 15);

STORE site0 INTO 'pigsplit1/0/' USING org.apache.pig.piggybank.storage.MultiStorage('pigsplit1/0/','2', 'bz2', '\\x7F');
STORE site3 INTO 'pigsplit1/3/' USING org.apache.pig.piggybank.storage.MultiStorage('pigsplit1/3/','2', 'bz2', '\\x7F');
STORE site15 INTO 'pigsplit1/15/' USING org.apache.pig.piggybank.storage.MultiStorage('pigsplit1/15/','2', 'bz2', '\\x7F');

そして、それは私がやりたかったことにはうまく機能しますが、実際には少なくとも22の可能なサイトIDがあり、それ以上ないかどうかはわかりません。分割を動的に作成し、その列に基づいてパスに格納したいと思います。これを行う最も簡単な方法は、MultiStorage UDFを2段階で使用することです。最初にサイトIDで分割し、次にそれらすべての結果をロードして、日付で分割しますか?それは非効率のようです。どういうわけかGROUPBYを介してそれを行うことができますか?サイトIDでGROUPBYしてから、各行をフラット化し、その上でマルチストレージを実行できるはずですが、GROUPをパスに連結する方法がわかりません。

4

2 に答える 2

0

UDF は、MultiStorage入力を 2 つの異なるフィールドに分割するように設定されていませんが、基本的にはそれを行っているため、2 つのパラメーターを使用SPLITしてエミュレートするだけです。MultiStorageその場合、次のことをお勧めします。

REGISTER /usr/lib/pig/piggybank.jar;

inputData = LOAD '/data/$date*.{bz2,bz,gz}' USING PigStorage('\\x7F')
AS (
SITE_ID_COL                 :int,--                     = Item Site ID
META_ID_COL                 :int,--                 = Top Level (meta) category ID
EXTRACT_DATE_COL            :chararray,--          = Date for the data points
...
)

dataWithKey = FOREACH inputData GENERATE CONCAT(CONCAT(SITE_ID_COL, '-'), EXTRACT_DATE_COL), *;

STORE dataWithKey INTO 'tmpDir' USING org.apache.pig.piggybank.storage.MultiStorage('tmpDir', '0', 'bz2', '\\x7F');

次に、単純なスクリプトを使用して出力を調べて、出力ディレクトリ内のすべてのファイルを一覧表示し、サイト ID と日付 ID を抽出して、好きな構造の適切な場所に移動します。

最もエレガントな回避策ではありませんが、問題なく機能する可能性があります。注意すべきことの 1 つは、キーで選択したセパレーターが許可されていない可能性があることです (英数字のみの可能性があります)。また、出力データに余分なフィールドが残ることになります。

于 2013-03-07T20:40:56.487 に答える
0

私は実際に MultiStorage モジュールにパッチを提出して、タプル フィールドを 1 つだけではなく複数に分割できるようにして、動的な出力ツリーを作成しました。

https://issues.apache.org/jira/browse/PIG-3258

まだあまり注目されていませんが、本番環境では問題なく使用しています。

于 2013-04-17T14:11:33.017 に答える