pig脚本:使用空值连接表

wmtdaxz3  于 2021-06-25  发布在  Pig
关注(0)|答案(1)|浏览(305)

我想连接两个表,但我对不同类型的连接有点迷茫

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

有解决办法吗?

w46czmvw

w46czmvw1#

你在找左边的 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 那么事先 ORDER 在号码上 RANKJOIN .

相关问题