1

私は大きなファイル(10億以上のレコード)を読んでいて、それを他の3つのファイルと結合していますが、大きなテーブルでの複数の読み取りを回避するためにプロセスをより効率的にすることができるかどうか疑問に思いました。小さなテーブルは収まらない可能性がありますメモリー。

A = join smalltable1 by  (f1,f2) RIGHT OUTER,massive by (f1,f2) ;
B = join smalltable2 by  (f3) RIGHT OUTER, A by (f3) ;
C = join smalltable3 by  (f4) ,B by (f4) ;

私が考えていた別の方法は、udfを書き込んで、1回の読み取りで値を置き換えることですが、小さなファイルがメモリに収まらないため、udfが効率的かどうかはわかりません。実装は次のようになります。

A = LOAD massive 
B = generate f1,udfToTranslateF1(f1),f2,udfToTranslateF2(f2),f3,udfToTranslateF3(f3)

あなたの考えに感謝します...

4

1 に答える 1

1

Pig0.10はブルームフィルターとの統合を導入しましたhttp://search-hadoop.com/c/Pig:/src/org/apache/pig/builtin/Bloom.java%7C%7C+%2522done+%2522exec+Tuple%2522

3つの小さいファイルでブルームフィルターをトレーニングし、大きいファイルをフィルター処理できます。うまくいけば、小さいファイルになります。その後、標準の結合を実行して100%の精度を取得します。

更新1 異なるキーで結合するため、実際には2つのブルームフィルターをトレーニングする必要があります。各小さなテーブルに1つずつです。

UPDATE 2 コメントで、外部結合がデータの拡張に使用されることが言及されました。この場合、ブルームフィルターは最適ではない可能性があります。一致しないデータを保持する必要があるため、外部結合にデータを追加せずにフィルタリングするのに適しています。より良いアプローチは、すべての小さなテーブルをそれぞれのフィールド(f1、f2、f3、f4)に分割し、各パーティションをメモリにロードするのに十分小さい個別のファイルに格納することです。f1、f2、f3、f4のGroup BYの大規模なテーブルよりも、FOREACHで、関連付けられたバッグを含むグループ(f1、f2、f3、f4)をJavaで記述されたカスタム関数に渡します。この関数は、小さなファイルのそれぞれのパーティションをにロードします。 RAMと拡張を実行します。

于 2012-09-13T10:59:51.290 に答える