我有一个过滤器关键字列表(数量大约为1000),我需要使用此列表过滤猪的关系字段。
最初,我已将这些关键字声明为: %声明p1'。 keyword1。'; .... ...
%声明p1000'。 keyword1000。';
我正在做过滤:
Filtered = FITLER SRC BY(不是$ 0匹配'$ p1')和(不是$ 0匹配'$ p2')和......(不是$ 0匹配'$ p1000');
DUMP已过滤;
假设我的源关系在SRC中,我需要在第一个字段上应用过滤,即$ 0。
如果我将过滤器数量减少到100-200,那就可以了。但随着过滤器的数量增加到1000.它不起作用。
有人可以建议解决问题吗?
提前致谢
答案 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脚本中,该脚本执行从输入中分离的内容,并在正在过滤的当前关键字子集上开始运行。