2013-06-19 51 views
0

我已“由基团”上的关系,其结果进行的关系是类似于以下:生成从第二场在猪

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}

您对此有何帮助?

萨拉

+0

所以你想拥有一个包的所有元素?分组的意义何在? –

+0

我对每个组成员(pairwise diff)做了一些处理,然后想要参加联合 –

回答

0

如果你想要什么,我想你想你正在寻求建立一个新的关系,其中每个前身是从分组袋的元组现在的全部记录。为此,请使用FLATTEN操作员,该操作员将包放入多个记录中。如果你可以假定所有袋中的元组具有相同的架构,你还可以FLATTEN那些推动的元组元素,以全面的领域:

如果A是分组的结果,并

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

你可以做

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

然后到元组充分行转换,做

C = FOREACH B GENERATE FLATTEN(tuple); 

您可以阅读更多关于FLATTENhere

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)})