【问题标题】:Too many filter matching in pig猪中的过滤器匹配过多
【发布时间】:2012-04-27 21:56:03
【问题描述】:

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

最初,我声明了这些关键字,例如: %declare p1 '.keyword1.'; …… ...

%declare p1000 '.keyword1000.';

然后我进行如下过滤:

Filtered= FITLER SRC BY (not $0 匹配 '$p1') and (not $0 匹配 '$p2') and ...... (not $0 匹配 '$p1000');

已过滤转储;

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

如果我将过滤器的数量减少到 100-200,它工作正常。但是随着过滤器的数量增加到 1000。它不起作用。

有人可以建议一种解决方法来获得正确的结果吗?

提前致谢

【问题讨论】:

    标签: filter hadoop apache-pig


    【解决方案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);
            }
        }
    
      }
    

    【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-10
      • 1970-01-01
      相关资源
      最近更新 更多