Pig:将 FOREACH 运算符应用于包中的每个元素
Posted
技术标签:
【中文标题】Pig:将 FOREACH 运算符应用于包中的每个元素【英文标题】:Pig: apply a FOREACH operator to each element within a bag 【发布时间】:2012-08-24 09:18:48 【问题描述】:示例:我有一个关系“班级”,有一个嵌套的学生包:
class: teacher_name: chararray,students: (firstname: chararray, lastname: chararray)
我想对每个学生执行一个操作,同时保持全局结构不变,即获取:
class: teacher_name: chararray,students: (fullname: chararray)
每个学生的位置,fullname = CONCAT(firstname, lastname)
我的理解是嵌套 FOREACH 不是我的解决方案,因为它仍然只为每个输入元组生成 1 条记录,而我想要在每个包项中应用的东西。
使用 UDF 很容易做到,但想知道是否可以在纯 Piglatin 中做到这一点
【问题讨论】:
【参考方案1】:在 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有什么用,你做过什么,可以在生成后组中完成。所以它似乎没有太多场景..你能解释一下吗。 嵌套的 foreach 遍历了包的元素,因此保留了包。如果你不需要保存袋子,那就压平和战斗,但这不是问题。以上是关于Pig:将 FOREACH 运算符应用于包中的每个元素的主要内容,如果未能解决你的问题,请参考以下文章
类“myClassName”已存在于包“myPackageName”中
Pig - 使用位置表示法时如何在 JOIN 后引用 FOREACH 中的列?