pig script:连接具有空值的表

时间:2013-10-16 15:12:35

标签: apache-pig

我想加入2个表格,而且我对不同类型的连接有点迷失

A(a_name:chararray, a_number:int)
a    1
b    2
c    
d    3
e    

B(b_id:int, b_name:chararray)
1    one
2    two
3    three

我知道我需要某种加入,但是

AB = JOIN A by a_number, B by b_id;
FOREACH AB GENERATE
    a_name,
    b_name as a_number;

我得到了

a    one
b    two
d    three

而不是

a    one
b    two
c    
d    three
e    

我真正想要的。 我该怎么做?

编辑:

好的,我尝试了左连接,但它没有保留行顺序而是返回

a    one
b    two
d    three
c    
e    

任何解决方法?

1 个答案:

答案 0 :(得分:3)

您正在寻找left JOIN       A left join
这将使所有值保持在关系的左侧,即使它们没有出现在右侧。 Pig默认为内部JOIN,因此它只保留两边的值。

现在这将产生您的期望。

AB = JOIN A by a_number LEFT, B by b_id;
C = FOREACH AB GENERATE a_name, b_name AS a_number;

此外,您应该能够将这两个关系压缩为:

AB = FOREACH (JOIN A by a_number LEFT, B by b_id)
     GENERATE a_name, b_name AS a_number;

据我所知,JOIN中没有选项来反对左边关系的顺序。但是,您可以事先RANK A,然后RANK JOIN在{{1}}之后创建。