2012-04-27 116 views
1

我有一個過濾器關鍵字列表(大約1000個數字),我需要使用這個列表過濾一個關係領域的豬。豬過濾器匹配過多

最初,我宣佈這些關鍵字如: %declare p1'。 keyword1。'; .... ...

%declare p1000'。 keyword1000。';

然後我做過濾,如:

過濾= 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

你能給我輕微的概述,我應如何在驅動程序中豬腳本鏈接我的用戶定義的函數。 – 2012-05-02 05:22:30

+0

查看文檔中的REGISTER和DEFINE函數http://pig.apache.org/docs/r0.9.2/basic.html#register – 2012-05-02 06:53:16

0

一個簡單的方法是將過濾分爲幾個階段。在第一階段過濾關鍵字1到100,然後過濾另一個100,依次類推(計數(關鍵字)/ 100)階段。但是,給出更多的數據細節,可能有更好的解決方案。

至於上述淺顯的解決方案,您可以將豬腳本包裝在一個shell腳本中,該腳本將parcell輸出並輸入,並開始對正在過濾的當前關鍵字子集運行。