【问题标题】:Pig Join - How to join two table with multiple fields where one of the field in key is optional?Pig Join - 如何连接具有多个字段的两个表,其中键中的一个字段是可选的?
【发布时间】:2016-03-31 20:18:50
【问题描述】:

问题:Pig Beginner- 下面是我的两个输入表

Table 1: Contain 3 columns (VID, TID and USID)
v1 TID101 US101 
v2 TID102 
v3 TID103 
v4 TID104 US104 
v5        US105 
v6        US106 

Table 2: Contain 3 columns (PID, TID, USID)
p1 TID101 US101
p2 TID102 US102
p3 TID103 US103
p4 TID104 US104
p5 TID105 US105

我想加入表 1 和 2 并得到如下输出:

Expected Output:
v1 TID101 US101 p1
v2 TID102       p2
v3 TID103       p3
v4 TID104 US104 p4
v5        US105 p5

我尝试了如下内连接:

a= JOIN table1 BY (TID, USID), table2 BY (TID, USID);
b= FOREACH a GENERATE table1::vID, table1::TID, table1::USID, table2::PID;

但我只得到以下输出:

Actual Output:
v1 TID101 US101 p1
v4 TID104 US104 p4

我可以尝试左外连接,但我觉得当我通过多个键加入时,两个键都被认为是强制加入的,我不能有“或”条件。如果 table1 记录包含 USID 或 TID,我正在尝试从 table2 获取 PID。我不确定我错过了什么,并且有兴趣了解达到预期输出的最佳方法。请帮忙!

【问题讨论】:

    标签: join apache-pig


    【解决方案1】:

    加入单列,合并结果并区分最终关系。

    PigScript

    A = LOAD 'test1.txt' USING PigStorage('\t') as (a1:chararray,a2:chararray,a3:chararray);
    B = LOAD 'test2.txt' USING PigStorage('\t') as (b1:chararray,b2:chararray,b3:chararray);
    
    A2 = JOIN A BY (a2),B by (b2);
    A3 = JOIN B BY (b3),A by (a3);
    
    C = FOREACH A2 GENERATE A::a1,A::a2,A::a3,B::b1;
    D = FOREACH A3 GENERATE A::a1,B::b2,B::b3,B::b1;
    
    E = UNION C,D;
    E1 = DISTINCT E;
    
    DUMP E1;
    

    输出

    【讨论】:

    • 谢谢。这很有帮助
    猜你喜欢
    • 2022-08-20
    • 2011-05-17
    • 2021-02-06
    • 1970-01-01
    • 2022-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多