2012-04-27 11 views
1

フィルタキーワード(約1000個)のリストがあり、このリストを使用してブタのリレーションのフィールドをフィルタリングする必要があります。ブタのフィルタマッチングが多すぎます

最初に、私は %declare p1 'のようなキーワードを宣言しました。 キーワード1。 '; .... ...

%p1000 'を宣言してください。 キーワード1000。 ';私は、その後のようなフィルタリングを行っています

ろ過= FITLER SRC BY(ない$ 0マッチ '$のP1')と(ない$ 0マッチ '$のP2')と......(ない$ 0試合'$ p1000');

DUMPフィルタリング。

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

フィルタの数を100〜200に減らす場合は問題ありません。しかし、フィルタの数が1000に増えるにつれて、それは機能しません。

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

ありがとうございます。

答えて

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); 
     } 
    } 

    } 
+0

あなたは私が運転豚スクリプトで私のユーザー定義関数をリンクするものとどのように私に若干の概要を与えることができます。 –

+0

docs http://pig.apache.org/docs/r0.9.2/basic.html#registerのREGISTER関数とDEFINE関数を見てください。 –

0

1つの浅いアプローチは、フィルタリングを段階に分割することです。キーワード1〜100を第1段階でフィルタリングし、次に別の100件をフィルタリングして合計(カウント(キーワード)/ 100)の段階にします。しかし、データの詳細があれば、おそらくこれに対するよりよい解決策があります。

上記の浅い解決策では、豚のスクリプトを入力から除外するシェルスクリプトにラップし、フィルタリングされている現在のキーワードサブセットで実行を開始することができます。

関連する問題