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 运算符应用于包中的每个元素的主要内容,如果未能解决你的问题,请参考以下文章

foreach (R):抑制从全局环境加载的包中的消息

类“myClassName”已存在于包“myPackageName”中

Apache Pig 中的区间交集

Pig - 使用位置表示法时如何在 JOIN 后引用 FOREACH 中的列?

通过在 PIG 中的同一块内计算的条件值在 FOREACH 块内进行过滤

我可以使用 Pig Latin 中的嵌套 FOREACH 语句生成嵌套包吗?