2012-05-15 23 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;