我在关系上执行了“group by”,结果类似于以下内容:
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}
Coud你对此有所帮助吗?
萨拉
答案 0 :(得分:0)
如果你想要我想你想要的东西你正在寻求创建一个新的关系,其中以前在分组中的每个元组现在都是一个完整的记录。要执行此操作,请使用FLATTEN
运算符,将数据包分成多个记录。如果您可以假设包中的所有元组具有相同的模式,则可以另外FLATTEN
将元组元素推广到成熟的字段:
如果A
是分组的结果,
DESCRIBE A;
{(key:chararray, bag:{})}
你可以做到
B = FOREACH A GENERATE FLATTEN(bag) AS tuple;
然后将元组转换为完整行,执行
C = FOREACH B GENERATE FLATTEN(tuple);
您可以详细了解FLATTEN
here。
答案 1 :(得分:0)
为了得到像你开始时的结果,我做了:
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)})