6

例:ネストされた学生のバッグを持つリレーション「クラス」があります。

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

グローバル構造をそのままにして、各生徒に対して操作を実行したい。つまり、次を取得します。

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

ここで、各学生について、fullname = CONCAT(firstname、lastname)

私の理解では、ネストされたFOREACHは、入力タプルごとに1つのレコードしか生成しないため、ここでは解決策にはなりませんが、各バッグアイテム内に適用されるものが必要です。

UDFで行うのは非常に簡単ですが、純粋なピッグラテンでそれを行うことが可能かどうか疑問に思いました

4

1 に答える 1

19

PIG 0.10 では、FOREACH は FOREACH にネストできるため、UDF なしで実行できます。次に例を示します。

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 に答える