我有以下输入:
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
表有多列。
答案 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别名的项目必填字段。