2012-08-24 12 views
6

Ejemplo: Tengo una relación "clase", con una bolsa de anidada de los estudiantes:Cerdo: aplicar un operador FOREACH a cada elemento dentro de una bolsa

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

Quiero realizar una operación en cada estudiante, mientras dejando intacta la estructura global, es decir, obtener:

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

donde para cada estudiante, nombre completo = concat (nombre, apellido)

mi entendimiento es que un FOREACH anidada no sería mi solución a este problema, como se todavía solo genera 1 registro por tupla de entrada, mientras que yo quiero algo que se aplique dentro de cada elemento del bolso.

bastante fácil de hacer con un UDF pero se preguntó si es posible hacerlo en el más puro piglatin

Respuesta

19

En PIG 0.10 es posible sin la UDF, como FOREACH se puede anidar en FOREACH. Aquí hay un ejemplo:

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

¿Cuál es el uso de foreach anidado? Lo que sea que hayas hecho, eso se puede hacer en el grupo generar después. así que no parece tener mucha escena ... ¿podría explicarme por favor? –

+0

Foreach anidado había iterado a través de los elementos de la bolsa y, por lo tanto, había conservado la bolsa. Si no necesita conservar la bolsa, aplaste y combata, pero esa no era la pregunta. – alexeipab

Cuestiones relacionadas