我的數據集如下所示:拼合元組就像一個袋子
(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