Pig Latin按字符串列表过滤

时间:2012-03-01 17:38:55

标签: filter apache-pig

我有一个包含网址的文件 和3个包含我想要查看的URL的文件,如果它们存在于第一个文件中

第一个文件的示例是

http://www.url1.com/xxxx/xxx/xxx/xxx/

http://www/urln.com/zzz/zzz/zzz/zzzz/zzzz/zz

过滤器文件的示例:

过滤器1

url1.com

url2.com

过滤器2

url5.com

url6.com/ddfd

urlx.org

我想要做的是在相同的通道上(如果可能)检查来自filter1的任何网址或过滤器2中的任何网址,依此类推在第一个文件中,如果是将匹配写入以该过滤器命名的文件(过滤器名称无关)。 重要的是每个过滤器

输出将是这样的

filter1.out

http:// www.url1.com/xxx/sss http:// www.url2.com/xxx/xxxx/xxxx

2 个答案:

答案 0 :(得分:2)

我会高度描述一下我的鞋子做法:

  1. 将所有文件加载为数据集。我们可以称它们为url,filter1,filter2和filter3
  2. 如果我理解正确,三个过滤器之间没有区别,所以只需将它们作为新数据集联合起来我们称之为big_filter。
  3. 使用正则表达式使用big_filter加入网址以从网址中提取基本网址。 REGEX_EXTRACT是一个内置的Pig函数。内部联接将删除url中不在过滤器中的所有项目。
  4. 生成结果数据集中的url列。
  5. 对步骤4中生成的数据集运行DISTINCT。
  6. 使用您最喜欢的任何形式,使用各种猪存储功能之一存储步骤5中生成的数据集。

答案 1 :(得分:2)

假设过滤器文件适合计算节点上的内存 - 使用Perl或其他喜欢的语言通过此过滤器匹配和流式传输数据,例如:

DEFINE MY_FILTER ` perl $script $filter1 $filter2 filter3 ` SHIP('$script','$filter1', '$filter2', '$filter3');
A = load '$input';
B = stream A through MY_FILTER;
store B into '$output';

这一次运行。 从定义$ filter和其他参数的bash脚本中调用此Pig脚本。 在$脚本中实现字符串匹配和输出,它将加载$ filter1,$ filter2和$ filter3,从STDIN进行匹配并以所需格式生成输出。