我想加入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
任何解决方法?
答案 0 :(得分:3)
您正在寻找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}}之后创建。