寻找在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中的匹配主题,然后在其中查找名称。
答案 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,