0

我有以下输入:

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()UDF ,但我不确定这是否能完成这项工作,因为它似乎要求两个表都是单例的,而我的表有多个列。datafuinput

4

1 回答 1

1

我们可以使用 RIGHT join 并过滤 stpwrd 中的记录来实现此目标,下面的示例说明了用法。

输入:输入数据

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 别名的项目必填字段。

于 2016-01-27T19:02:06.193 回答