我的数据集如下所示:拼合元组就像一个袋子
(A, (1,2))
(B, (2,9))
我想“扁平化”,在猪的元组,基本上是重复在内部元组中的每个值每条记录,使得预期的输出是:
(A, 1)
(A, 2)
(B, 2)
(B, 9)
我知道这是可能的时候元组(1,2)和(2,9)是袋而不是。
我的数据集如下所示:拼合元组就像一个袋子
(A, (1,2))
(B, (2,9))
我想“扁平化”,在猪的元组,基本上是重复在内部元组中的每个值每条记录,使得预期的输出是:
(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 TransposeTupleToBag(http://datafu.incubator.apache.org/docs/datafu/1.1.0/datafu/pig/util/TransposeTupleToBag.html),然后将袋子展平以获得袋子中每件物品的一排。
我知道这是一个旧的线程,但我无法得到上述方法的工作。以为我会分享我的发现。
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;
不错!在这种情况下,元组有两个元素(b.b1,b.b2)。当元组的大小可能有所不同时,我该如何做到这一点? – Marquez
我也想知道如何用一个可变长度的元组来做到这一点。 –
您可以为此编写自己的UDF。 DataBag bag = BagFactory.getInstance()。newDefaultBag(); (int i = 0; i
hobgoblin