Pig:在 Set 上过滤多列 table

Pig: Filter multi-column table on Set

我有以下输入:

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 table 中的行,其 input.token 字段不在 stpwrd.

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

我们可以objective使用 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 别名的项目必填字段。