2012-01-09 113 views
1

寻找一些帮助在阿帕奇猪编写子查询。例如,我有以下两个关系 -阿帕奇猪子查询

A 
sam 12 grad maths 
sony 13 postgrad english 

B 
maths {(4.5,sam),(4,david)} 
english {(4.2,peter),(3.9,rob)} 

加入这两个关系的主题,即一个由A. $ 3和B由B $ 0,必须编写查询,这将给输出 -

sam 12 grad maths 4.5 
sony 13 postgrad english 

基本上它应该检查B中的匹配主题,然后在其中查找名称。

回答

2

我会接近这个是flattenB关系的方式,然后做一个左外连接到A.

首先,扁平化的关系了:

C = FOREACH B GENERATE $0, FLATTEN($1); 

这意味着你的约会到:

maths, 4.5, sam 
maths, 4, david 
english, 4.2, peter 
english, 3.9, rob 

现在,你可以做一个JOIN带来的数据一起(我重命名这个东西让我的头straig ht):

J = JOIN A BY (Aname, Asubject), C BY (Bname, Bsubject); 
J2 = FOREACH J GENERATE Astudent, Agrade, Alevel, Asubject, Bscore; 

dump J2只会输出sam, 12, grad, maths, 4.5

但是,有一个问题。如果列表A中的项目没有显示在列表B中,您似乎希望获得NULL的值。这是LEFT OUTER join的工作,幸运的是,Pig can do outer joins。修改上面的代码如下:

J = JOIN A BY (Aname, Asubject) LEFT OUTER, C BY (Bname, Bsubject); 
J2 = FOREACH J GENERATE Astudent, Agrade, Alevel, Asubject, Bscore; 

dump J2在这里会输出,这是我想你想:

sam, 12, grad, maths, 4.5 
sony, 13, postgrad, english,