私は2つの問題に直面しています:
レポート ファイル
PIG レポートを生成しています。その出力は、part-r-00000、part-r-00001 などの複数のファイルに出力されます (これは同じ関係から生じます。複数のマッパーがデータを生成しているだけです。したがって、複数のファイルが存在します。):
B = FOREACH A GENERATE col1,col2,col3; STORE B INTO $output USING PigStorage(',');
これらすべてを 1 つのレポートにまとめたいので、 を使用して結果を保存する前に、
HBaseStorage
並列 1: を使用して並べ替えますreport = ORDER report BY col1 PARALLEL1
。つまり、レデューサーの数を 1 に強制しているため、次のように単一のファイルを生成しています。B = FOREACH A GENERATE col1,col2,col3; B = ORDER B BY col1 PARALLEL 1; STORE B INTO $output USING PigStorage(',');
単一のファイル出力を生成するより良い方法はありますか?
グループ化
group-by を実行するレポートがいくつかあります。
grouped = GROUP data BY col
言及しない限りparallel 1
、PIG は結果をグループ化するために複数のレデューサーを使用することがあります。データを合計またはカウントすると、間違った結果が得られます。例えば:これを見る代わりに:
part-r-00000: grouped_col_val_1, 5, 6 grouped_col_val_2, 1, 1 part-r-00001: grouped_col_val_1, 3, 4 grouped_col_val_2, 5, 5
私が見ているはずです:
part-r-00000: grouped_col_val_1, 8, 10 grouped_col_val_2, 6, 6
したがって、次のようにグループを実行することになります。
grouped = GROUP data BY col PARALLEL 1
その後、正しい結果が表示されます。何かが足りない気がします。
これは、グループ化を行う方法の疑似コードです。
raw = LOAD '$path' USING PigStorage... row = FOREACH raw GENERATE id, val grouped = GROUP row BY id; report = FOREACH grouped GENERATE group as id, SUM(val) STORE report INTO '$outpath' USING PigStorage...