我的数据集如下所示:
( A, (1,2) ) ( B, (2,9) )
我想“展平”pig中的元组,基本上为内部元组中找到的每个值重复每个记录,这样预期的输出是:
( A, 1 ) ( A, 2 ) ( B, 2 ) ( B, 9 )
我知道当元组(1,2)和(2,9)是包时这是可能的。
egmofgnx1#
我知道这是一个旧线程,但我不能得到上述方法的工作。我想我会分享我的发现。
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;
tf7tbtn22#
你的洞察力是好的;通过在一个袋子里变换元组是可能的。我们想要的模式是:{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算子。
jslywgbw3#
您可以使用datafu的udf transportsetupletobag(http://datafu.incubator.apache.org/docs/datafu/1.1.0/datafu/pig/util/transposetupletobag.html)然后把袋子压平,使袋子里的每一件物品都排成一行。
3条答案
按热度按时间egmofgnx1#
我知道这是一个旧线程,但我不能得到上述方法的工作。我想我会分享我的发现。
最初,我使用strsplit生成一个元组,得到与上面类似的输入,但没有成功。
这导致输出为:
然而,当我使用tokenize和replace函数时,我得到了所需的输出。
tf7tbtn22#
你的洞察力是好的;通过在一个袋子里变换元组是可能的。我们想要的模式是:{a:chararray,{(chararray)}}例如:(a,{(1),(2)})
以下是解决问题的方法:
神奇的部分是tobag算子。
jslywgbw3#
您可以使用datafu的udf transportsetupletobag(http://datafu.incubator.apache.org/docs/datafu/1.1.0/datafu/pig/util/transposetupletobag.html)然后把袋子压平,使袋子里的每一件物品都排成一行。