如何循环通过一个袋子里的元组,Pig

dm7nw8vv  于 2021-06-21  发布在  Pig
关注(0)|答案(2)|浏览(266)

我是新手。
我有意见, (A,B,{(XYZ,123,CDE)}) 我想在里面的袋子里循环打印以下记录。

(A,B,XYZ)  
(A,B,123)
(A,B,CDE)

有人能帮帮我吗!

w7t8yxp5

w7t8yxp51#

解决了的!!
让我们加载下面的文件(制表符分隔)
a b{(xyz,123,cde)}

input_plus_bag = load '' USING PigStorage() AS (entry1:chararray, entry2:chararray, bag1:bag{(te1:chararray, te2:int, te3:chararray)});

intermed_output = foreach input_plus_bag generate entry1, entry2, FLATTEN(bag1);

Dump intermed_output;

这会给你
(a、b、xyz、123、cde)

DESCRIBE intermed_output;

intermed_output: {entry1: chararray,entry2: chararray,bag1::te1: chararray,bag1::te2: int,bag1::te3: chararray}

现在执行tobag操作

intermed2_output = foreach intermed_output generate entry1, entry2, TOBAG(bag1::te1,bag1::te2,bag1::te3);

 DUMP intermed2_output;

这将导致以下结果output:-
(a,b,{(xyz),(123),(cde)})
最后一步是把袋子弄平

final_output = foreach intermed2_output generate entry1, entry2, FLATTEN($2);

我们有我们想要的output:-

(A,B,XYZ)
(A,B,123)
(A,B,CDE)
laik7k3q

laik7k3q2#

假设x是你的关系,它有 (A,B,{(XYZ,123,CDE)}) .tobag将表达式转换为bag并展平unnests元组bag。

Y = FOREACH X GENERATE $0,$1,ToBag(FLATTEN($2));

相关问题