如何在Pig中找到没有UDF的袋子和元素的交集?

时间:2018-09-25 01:42:33

标签: apache-pig

我说过两个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

1 个答案:

答案 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)