2

私のコードは次のようになります:

pymt = LOAD 'pymt' USING PigStorage('|') AS ($pymt_schema);

pymt_grp = GROUP pymt BY key

results = FOREACH pymt_grp {

      /*
       *   some kind of logic, filter, count, distinct, sum, etc.
       */
}

しかし今、私はそのような多くのログを見つけました:

org.apache.pig.impl.util.SpillableMemoryManager: Spilled an estimate of 207012796 bytes from 1 objects. init = 5439488(5312K) used = 424200488(414258K) committed = 559284224(546176K) max = 559284224(546176K)

実際に原因を見つけました。主な理由は、IPアドレスとしてkey = 0のような「ホット」キーがあるためですが、このキーをフィルタリングしたくありません。解決策はありますか?UDF に代数およびアキュムレータ インターフェイスを実装しました。

4

1 に答える 1

6

大きく歪んだデータまたはFOREACHにネストされたDISTINCTでも同様の問題が発生しました(PIGはメモリ内で個別に実行するため)。解決策は、例としてDISTINCTをFOREACHから削除することでした。これは、PIGラテン語でgroupbyステートメントを最適化する方法に対する私の回答を参照してください。

SUMとCOUNTの前にDISTINCTを実行したくない場合は、2GROUPBYを使用することをお勧めします。キー列の最初のグループと別の列または乱数mod100は、ソルトとして機能します(単一のキーのデータを複数のレデューサーに分散するため)。キー列の2番目のGROUPBYよりも、グループ1COUNTまたはSumの最終的なSUMを計算します。

元:

inpt = load '/data.csv' using PigStorage(',') as (Key, Value);
view = foreach inpt generate Key, Value, ((int)(RANDOM() * 100)) as Salt;

group_1 = group view by (Key, Salt);
group_1_count = foreach group_1 generate group_1.Key as Key, COUNT(view) as count;

group_2 = group group_1_count by Key;
final_count = foreach group_2 generate flatten(group) as Key, SUM(group_1_count.count) as count;
于 2012-08-17T10:03:43.700 に答える