1

我有一个过滤关键字列表(大约 1000 个),我需要使用这个列表过滤 pig 中的一个关系字段。

最初,我已经声明了这些关键字,例如: %declare p1 '。关键词 1。'; …………

% 声明 p1000 '。关键字 1000。';

然后我正在做过滤,如:

Filtered= FITLER SRC BY (not $0 匹配 '$p1') and (not $0 匹配 '$p2') and ...... (not $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 到 100,然后过滤另外 100 个,依此类推,总共 (count(keywords)/100) 个阶段。但是,鉴于您的数据的更多详细信息,可能有更好的解决方案。

对于上述浅层解决方案,您可以将 pig 脚本包装在一个 shell 脚本中,该脚本对输入进行打包并在当前被过滤的关键字子集上开始运行。

于 2012-04-27T12:58:53.970 回答