Я хотел бы подойти к этому так: выровнять отношение 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
.
Но есть проблема.Похоже, вы хотите иметь значение NULL
, если ваш элемент в списке A не отображается в списке B. Это работа для LEFT OUTER
объединения и, к счастью, Свиньяможет делать внешние соединения .Измените приведенный выше код следующим образом:
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,