Pig:在Set上过滤多列表

时间:2016-01-27 15:17:56

标签: filter nlp apache-pig token apache-datafu

我有以下输入:

input = LOAD '$in_data' USING PigStorage('\t', '-schmea') AS (
   uid:chararray,
   pid:int,
   token:chararray
);
stpwrd = LOAD '$stpwrd' USING PigStorage('\t', '-schema') AS (
   token:chararray
);

我的目标可以归纳为以下伪代码:

output = FILTER input BY NOT IN(input.token, stpwrd);

,理想情况下会在input表中input.token字段不在stpwrd中的行中提供行。

我在SetDifference()link)中检查了datafu UDF,但我不确定是否能完成这项工作,因为它似乎要求两个表都是单例,而我的input表有多列。

1 个答案:

答案 0 :(得分:1)

我们可以使用RIGHT join和过滤stpwrd中的那些记录来实现这个目标,下面的例子说明了用法。

输入:input_data

uid1    1   token1
uid2    2   token2
uid3    3   token3

输入:stpwrd

token1
token2

猪脚本:

    input_data = LOAD 'input_data' USING PigStorage('\t') AS (
   uid:chararray,
   pid:int,
   token:chararray
);

stpwrd = LOAD 'stpwrd' USING PigStorage('\t') AS (
   token:chararray
);

output_data = JOIN stpwrd BY token RIGHT, input_data BY token;

req_data = FILTER output_data BY stpwrd::token IS NULL;

输出:req_data

(,uid3,3,token3)

来自req_data别名的项目必填字段。