私は現在、次の豚のスクリプトを持っています(簡潔にするために列リストは切り捨てられています):
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をパスに連結する方法がわかりません。