pig中的过滤器匹配太多

qgelzfjb  于 2021-06-21  发布在  Pig
关注(0)|答案(2)|浏览(390)

我有一个过滤关键字列表(大约1000个数字),我需要使用这个列表过滤pig中的一个关系字段。
最初,我声明了如下关键字:%declare p1'.keyword1.'。。。
%声明p1000'.keyword1000';
然后我做了如下过滤:
filter=fitler src by(不是$0匹配'$p1')和(不是$0匹配'$p2')和(不是$0匹配“$p1000”);
转储已过滤;
假设我的源关系在src中,我需要对第一个字段应用过滤,即$0。
如果我把过滤器的数量减少到100-200个,它就可以正常工作了。但随着过滤器数量增加到1000个。它不起作用。
有人能提出一个解决办法来得到正确的结果吗?
提前谢谢

bhmjp9jg

bhmjp9jg1#

一种浅层方法是将过滤分为几个阶段。在第一阶段过滤关键字1到100,然后过滤另外100,以此类推,总共过滤(count(keywords)/100)个阶段。然而,考虑到数据的更多细节,可能有更好的解决方案。
对于上面的浅层解决方案,您可以将pig脚本 Package 在shell脚本中,该脚本对输入进行打包,并开始对正在筛选的当前关键字子集运行。

zvms9eto

zvms9eto2#

您可以编写一个简单的过滤器自定义项,在其中执行所有检查,例如:

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

  }

相关问题