1

我想加入 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    

任何解决方法?

4

1 回答 1

3

你正在寻找一个JOIN
                                                       左连接
这将保留关系左侧的所有值,即使它们没有出现在右侧。Pig 默认为 inner 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 AORDERRANKJOIN

于 2013-10-16T15:21:38.597 回答