猪的过滤器匹配太多

时间:2012-04-27 11:15:24

标签: filter hadoop apache-pig

我有一个过滤器关键字列表(数量大约为1000),我需要使用此列表过滤猪的关系字段。

最初,我已将这些关键字声明为: %声明p1'。 keyword1。'; .... ...

%声明p1000'。 keyword1000。';

我正在做过滤:

Filtered = FITLER SRC BY(不是$ 0匹配'$ p1')和(不是$ 0匹配'$ p2')和......(不是$ 0匹配'$ p1000');

DUMP已过滤;

假设我的源关系在SRC中,我需要在第一个字段上应用过滤,即$ 0。

如果我将过滤器数量减少到100-200,那就可以了。但随着过滤器的数量增加到1000.它不起作用。

有人可以建议解决问题吗?

提前致谢

2 个答案:

答案 0 :(得分: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);
        }
    }

  }

答案 1 :(得分:0)

一种浅薄的方法是将过滤分为几个阶段。在第一阶段过滤关键字1到100,然后过滤另一个100,依此类推总计(计数(关键字)/ 100)阶段。但是,鉴于您的数据的更多细节,可能有更好的解决方案。

对于上面的浅层解决方案,您可以将pig脚本包装在一个shell脚本中,该脚本执行从输入中分离的内容,并在正在过滤的当前关键字子集上开始运行。