2012-08-24 43 views
6

Ví dụ: Tôi có một mối quan hệ "lớp học", với một túi lồng nhau của học sinh:Pig: áp dụng một nhà điều hành foreach để mỗi phần tử trong một túi

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

Tôi muốn thực hiện một thao tác trên mỗi học sinh, trong khi rời khỏi cấu trúc toàn cầu bị ảnh hưởng, ví dụ, có được:

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

nơi cho mỗi học sinh, fullname = CONCAT (firstname, lastname)

sự hiểu biết của tôi là một foreach lồng nhau sẽ không có giải pháp của tôi ở đây, như nó vẫn chỉ tạo ra 1 bản ghi cho mỗi tuple đầu vào, trong khi tôi muốn cái gì đó sẽ áp dụng trong mỗi mục túi.

Khá dễ dàng để làm với một UDF nhưng băn khoăn liệu nó có thể làm điều đó trong tinh khiết Piglatin

Trả lời

19

Trong PIG 0.10 nó là nếu không có sự UDF, như foreach có thể được lồng trong foreach. Dưới đây là ví dụ:

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

việc sử dụng lồng nhau cho phép bạn đã làm gì, có thể thực hiện trong quá trình tạo sau nhóm. do đó, nó dường như không có nhiều cảnh .. bạn có thể vui lòng giải thích. –

+0

Nested foreach đã lặp lại thông qua các yếu tố của túi và do đó đã được bảo quản túi. Nếu bạn không cần phải bảo quản túi, hơn là làm phẳng và chiến đấu, nhưng đó không phải là câu hỏi. – alexeipab

Các vấn đề liên quan