подзапрос в apache pig - PullRequest
       10

подзапрос в apache pig

1 голос
/ 09 января 2012

Нужна помощь в написании подзапроса в 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 Ответ

2 голосов
/ 10 января 2012

Я хотел бы подойти к этому так: выровнять отношение 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, 
...