1

フィルター キーワードのリスト (約 1000 個) があり、このリストを使用して pig の関係のフィールドをフィルター処理する必要があります。

最初に、これらのキーワードを次のように宣言しました: %declare p1 '. キーワード1. '; …………

%declare p1000 '. キーワード1000。';

次に、次のようなフィルタリングを行っています。

Filtered= FITLER SRC BY ($0 が '$p1' に一致しない) and ($0 が '$p2' に一致しない) and ...... ($0 が '$p1000' に一致しない);

DUMP フィルタリング済み。

ソース関係が SRC にあり、最初のフィールド、つまり $0 にフィルタリングを適用する必要があるとします。

フィルターの数を 100 ~ 200 に減らしている場合は、正常に機能しています。しかし、フィルターの数が 1000 に増えると、うまくいきません。

誰かが結果を正しくするための回避策を提案できますか?

前もって感謝します

4

2 に答える 2

1

次のようなすべてのチェックを実行する単純なフィルター UDF を作成できます。

 package myudfs;
 import java.io.IOException;
 import org.apache.pig.FilterFunc;
 import org.apache.pig.data.Tuple;

 public class MYFILTER extends FilterFunc
 {
    static List<String> filterList;
    static MYFILTER(){
        //load all filters
    }
    public Boolean exec(Tuple input) throws IOException {
        if (input == null || input.size() == 0)
            return null;
        try{
            String str = (String)input.get(0);
           return !filterList.contains(str);
        }catch(Exception e){
            throw new IOException("Caught exception processing input row ", e);
        }
    }

  }
于 2012-04-27T13:56:03.283 に答える
0

浅いアプローチの 1 つは、ろ過を段階に分けることです。ステージ 1 で 1 から 100 のキーワードをフィルター処理し、次に別の 100 をフィルター処理するというように、合計 (count(keywords)/100) ステージになります。ただし、データの詳細を考えると、おそらくこれに対するより良い解決策があります。

上記の浅い解決策については、ピッグ スクリプトをシェル スクリプトでラップして、入力をパーセリングし、現在のキーワード サブセットでフィルター処理を開始することができます。

于 2012-04-27T12:58:53.970 に答える