2012-05-15 34 views
5

我的數據集如下所示:拼合元組就像一個袋子

(A, (1,2)) 
(B, (2,9)) 

我想「扁平化」,在豬的元組,基本上是重複在內部元組中的每個值每條記錄,使得預期的輸出是:

(A, 1) 
(A, 2) 
(B, 2) 
(B, 9) 

我知道這是可能的時候元組(1,2)和(2,9)是袋而不是。

回答

9

您的洞察力不錯;可以通過變換袋子中的元組來實現。我們要瞄準的模式是:{A:chararray,{(chararray)}}例如:(A,{(1),(2)})

這裏是解決問題的方法:

A = LOAD 'data.txt' AS (a:chararray,b:(b1:chararray,b2:chararray)); 
B = FOREACH A GENERATE a, TOBAG(b.b1,b.b2); 
C = FOREACH B GENERATE a, FLATTEN($1); 

魔術部分是TOBAG運算符。

+3

不錯!在這種情況下,元組有兩個元素(b.b1,b.b2)。當元組的大小可能有所不同時,我該如何做到這一點? – Marquez

+0

我也想知道如何用一個可變長度的元組來做到這一點。 –

+0

您可以爲此編寫自己的UDF。 DataBag bag = BagFactory.getInstance()。newDefaultBag(); (int i = 0; i hobgoblin

0

我知道這是一箇舊的線程,但我無法得到上述方法的工作。以爲我會分享我的發現。

input: (1-2-3, abc) 
     (4-5-6, xyz) 
desired output: 
     (1, abc) 
     (2, abc) 
     (3, abc) 
     (4, xyz) 
     (5, xyz) 
     (6, xyz) 

最初,我用STRSPLIT生成一個元組,導致與上面類似的輸入,但不成功。

output = FOREACH input GENERATE FLATTEN(TOBAG(STRSPLIT($0, '-'))), $1 

這導致輸出爲:

(1,2,3,abc) 
(4,5,6,xyz) 

然而,當我使用標記化和替換功能我得到所需的輸出。

output = FOREACH input GENERATE FLATTEN(TOKENIZE(REPLACE($0,'-', ' '))), $1;