2012-08-24 12 views
6

Przykład: Mam relację „klasa”, z zagnieżdżonego worek studentów:Pig: zastosowanie operatora foreach do każdego elementu w torbie

class: {teacher_name: chararray,students: {(firstname: chararray, lastname: chararray)} 

chcę wykonać operację na każdego ucznia, natomiast pozostawiając nietkniętą globalną strukturę, tj otrzymujemy:

class: {teacher_name: chararray,students: {(fullname: chararray)} 

gdzie dla każdego studenta, fullname = CONCAT (imię, nazwisko)

moim rozumieniu jest to, że zagnieżdżonych foreach nie byłoby moje rozwiązanie tutaj jako nadal generuje tylko 1 rekord na krotkę wejściową, podczas gdy ja chcę coś, co będzie miało zastosowanie w każdym przedmiocie torby.

Dość łatwe do zrobienia z UDF, ale zastanawiałem się, czy to możliwe, aby zrobić to w czystej Piglatin

Odpowiedz

19

W PIG 0.10 jest możliwe bez UDF, jak foreach można zagnieżdżać w foreach. Oto przykład:

inpt = load '~/pig/data/bag_concat.dat' as (k : chararray, c1 : chararray, c2 : chararray); 
dump inpt; 
1 q w 
1 s d 
2 q a 
2 t y 
2 u i 
2 o p 

bags = group inpt by k; 
describe bags; 

bags: {group: chararray,inpt: {(k: chararray,c1: chararray,c2: chararray)}} 

result = foreach bags { 
    concat = foreach inpt generate CONCAT(c1, c2); --it will iterate only over the records of the inpt bag 
    generate group, concat; 
}; 
dump result; 

(1,{(qw),(sd)}) 
(2,{(qa),(ty),(ui),(op)}) 
+0

jaki jest pożytek z zagnieżdżonego foreach, jaki kiedykolwiek zrobiłeś, co można zrobić w grupie generuj po. więc wydaje się, że nie ma dużej sceny. Czy mógłbyś to wyjaśnić? –

+0

Zagnieżdżony foreach przeszedł przez elementy torby, a tym samym zachował torbę. Jeśli nie potrzebujesz zachować torby, spłaszczyć i walczyć, ale to nie było pytanie. – alexeipab

Powiązane problemy