Apache pig 清管器:将FOREACH运算符应用于袋内的每个元件

Apache pig 清管器:将FOREACH运算符应用于袋内的每个元件,apache-pig,Apache Pig,示例:我有一个关系“class”,与一袋嵌套的学生: class: {teacher_name: chararray,students: {(firstname: chararray, lastname: chararray)} 我想对每个学生执行一个操作,同时保持全局结构不变,即获得: class: {teacher_name: chararray,students: {(fullname: chararray)} 其中,对于每个学生,fullname=CONCAT(firstname,l

示例:我有一个关系“class”,与一袋嵌套的学生:

class: {teacher_name: chararray,students: {(firstname: chararray, lastname: chararray)}
我想对每个学生执行一个操作,同时保持全局结构不变,即获得:

class: {teacher_name: chararray,students: {(fullname: chararray)}
其中,对于每个学生,fullname=CONCAT(firstname,lastname)

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


使用UDF非常容易,但是想知道是否可以用纯Piglatin来实现。在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)})

嵌套foreach的用途是什么?无论您做过什么,都可以在generate after组中完成。所以它似乎没有太多的场景。。你能解释一下吗?Nested foreach已经遍历了包的元素,因此保存了包。如果你不需要保存袋子,那就把它压扁和战斗吧,但那不是问题所在。