Hadoop 像袋子一样压扁元组

Hadoop 像袋子一样压扁元组,hadoop,apache-pig,flatten,Hadoop,Apache Pig,Flatten,我的数据集如下所示: ( A, (1,2) ) ( B, (2,9) ) 我想“展平”Pig中的元组,基本上为内部元组中找到的每个值重复每个记录,这样预期的输出是: ( A, 1 ) ( A, 2 ) ( B, 2 ) ( B, 9 ) 我知道当元组(1,2)和(2,9)是包时,这是可能的 你的洞察力很好;通过在包中转换元组是可能的。我们想要针对的模式是:{a:chararray,{(chararray)}}例如:(a,{(1)、(2)}) 以下是您问题的解决方案: A = LOAD 'd

我的数据集如下所示:

( A, (1,2) )
( B, (2,9) )
我想“展平”Pig中的元组,基本上为内部元组中找到的每个值重复每个记录,这样预期的输出是:

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

我知道当元组(1,2)和(2,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操作符。

您可以使用DataFu的UDF TransportSetupletoBag(),然后压平袋子,以获得袋子中每个项目的一行。

我知道这是一个旧线程,但我无法使用上述方法。我想我会分享我的发现

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)
然而,当我使用tokenize和replace函数时,我得到了所需的输出

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

美好的在这种情况下,元组有两个元素(b.b1、b.b2)。当元组的大小可能不同时,我该怎么做?我还想知道如何使用可变长度的元组进行此操作。您可以为此编写自己的UDF<代码>数据包包=BagFactory.getInstance().newDefaultBag();对于(inti=0;i有点晚,但使用
标记化
!()