从pig中的第二个域生成一个联合关系

zf9nrax1  于 2021-06-24  发布在  Pig
关注(0)|答案(2)|浏览(213)

我对一个关系执行了“分组方式”,结果如下所示:

g1,{a1,a2,a3}
    g2,{b1,b2,b3,b4}
    g3,{c1,c2,c3,c4,c5,c6}
    ...

所以第一个字段是组,第二个字段是元组包,每个元组包可能有不同数量的元素。我想做的是生成一个新的关系,其中包括第二个字段中的所有元素。因此,输出将是:b={a1,a2,a3,b1,b2,b3,b4,c1,c2,c3,c4,c5,c6}
你能帮忙吗?
萨拉

lokaqttq

lokaqttq1#

为了得到像你开始那样的结果,我做了:

grunt> A = LOAD '../../../input/tuplesSample.txt' using PigStorage(' ') AS (grupo:chararray, charo:chararray);
grunt> DESCRIBE A;
A: {grupo: chararray,charo: chararray}
grunt> B = GROUP A by grupo;
grunt> DESCRIBE B;
B: {group: chararray,A: {(grupo: chararray,charo: chararray)}}
grunt> C = FOREACH B GENERATE $0 as grupo, $1.charo as charos;
grunt> DESCRIBE C;
C: {grupo: chararray,charos: {(charo: chararray)}}
grunt> DUMP C;
C: {grupo: chararray,charos: {(charo: chararray)}}
(g1,{(a1),(a2),(a3)})
(g2,{(b4),(b3),(b2),(b1)})
(g3,{(c4),(c5),(c6),(c2),(c1),(c3)})

我这么做是为了给你一个新的关系( E (见下文)包含单个袋子中的所有元素。

grunt> D = FOREACH C GENERATE FLATTEN($1) as charos;
grunt> DESCRIBE D;
D: {charos: chararray}

grunt> E = GROUP D ALL;
grunt> DESCRIBE E;
E: {group: chararray,D: {(charos: chararray)}}
grunt> DUMP E;
(all,{(c3),(c1),(c2),(c6),(c5),(c4),(b1),(b2),(b3),(b4),(a3),(a2),(a1)})
ulmd4ohb

ulmd4ohb2#

如果您想要我认为您想要的,您正在寻求创建一个新的关系,其中以前在分组包中的每个元组现在都是一个完整的记录。为此,请使用 FLATTEN 接线员,把袋子炸成多个记录。如果您可以假设包中的所有元组都具有相同的模式,那么您还可以 FLATTEN 将元组元素提升到完整字段的步骤:
如果 A 是分组的结果,并且

DESCRIBE A;
{(key:chararray, bag:{})}

你能做到的

B = FOREACH A GENERATE FLATTEN(bag) AS tuple;

然后要将元组转换为整行,请执行以下操作

C = FOREACH B GENERATE FLATTEN(tuple);

你可以阅读更多关于 FLATTEN 在这里。

相关问题