2012-04-27 133 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输出并输入,并开始对正在过滤的当前关键字子集运行。