2013-06-19 47 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)})