【问题标题】:Pig: apply a FOREACH operator to each element within a bagPig:将 FOREACH 运算符应用于包中的每个元素
【发布时间】: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 中做到这一点

【问题讨论】:

    标签: apache-pig


    【解决方案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 遍历了包的元素,因此保留了包。如果你不需要保存袋子,那就压平和战斗,但这不是问题。
    猜你喜欢
    • 1970-01-01
    • 2014-09-20
    • 2021-07-23
    • 1970-01-01
    • 1970-01-01
    • 2020-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多