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