我说过两个Pig变量,
p ,即(id: int, companies: tuple(name:chararray))
和
q ,即(id: int, company: chararray)
。
现在,当我通过他们的“ id”加入 p 和 q 时,如何过滤{中没有q::company
的行{1}}?
PS,我遇到了这个问题Check if an element is present in a bag?,但这似乎与我的问题不完全相同。
示例
样本 p
1,(c1 c2 c3)
2,(c4 c5 c6)
3,(c2 c3 c5)
样本 q
1,c3
2,c8
3,c5
加入后的预期输出
1,c3
3,c5
答案 0 :(得分:0)
首先,您需要转换p
,以便ID和公司名称的每种组合都显示在自己的行上。
p_flattened = FOREACH p GENERATE
id,
FLATTEN(TOKENIZE(companies.name, ' ')) AS company;
dump p_flattened;
(1,c1)
(1,c2)
(1,c3)
(2,c4)
(2,c5)
(2,c6)
(3,c2)
(3,c3)
(3,c5)
然后与q结合使用,以仅返回出现在两种关系中的ID和名称,并执行foreach
来消除重复的字段。
pq_joined = JOIN p_flattened BY (id, company), q BY (id, company);
final = FOREACH pq_joined GENERATE
q::id AS id,
q::company AS company;
dump final;
(1,c3)
(3,c5)