6

示例:我有一个关系“类”,有一个嵌套的学生包:

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

我想对每个学生执行一个操作,同时保持全局结构不变,即获得:

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

对于每个学生,fullname = CONCAT(firstname, lastname)

我的理解是嵌套的 FOREACH 不是我的解决方案,因为它仍然只为每个输入元组生成 1 条记录,而我想要在每个包项中应用的东西。

使用 UDF 很容易做到,但想知道是否可以在纯 Piglatin 中做到这一点

4

1 回答 1

19

在 PIG 0.10 中,可以不使用 UDF,因为 FOREACH 可以嵌套在 FOREACH 中。这是一个例子:

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)})
于 2012-08-25T20:45:57.183 回答