apache pig中的子查询

时间:2012-01-09 13:11:27

标签: hadoop apache-pig

寻找在apache pig中编写子查询的一些帮助。例如,我有以下两个关系 -

A
sam 12 grad maths
sony 13 postgrad english

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

按主题加入两个关系,即A由A. $ 3和B由B. $ 0加入,并且必须编写查询,将输出作为 -

sam 12 grad maths 4.5
sony 13 postgrad english 

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

1 个答案:

答案 0 :(得分:2)

我接近这个的方法是flatten B关系,然后在A上做左外连接。

首先,要平掉关系:

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

这会将您的日期转换为:

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

现在,您可以执行JOIN将数据整合在一起(我正在重命名这些内容以保持头脑清醒):

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,