2017-03-05 50 views
1

//我用星火2.01 //如何在火花執行這種類型的乘積的2.01

我的數據看起來,

(K1,Array(V1,V2,V3.....V30)) 
(K2,Array(V1,V2,V3.....V30)) 
(K3,Array(V1,V2,V3.....V30)) 
... 
(K3704, Array(V1,V2,V3.....V30)) 

,我想創建一個每個鍵值的笛卡爾產品列表值。

(K1, (V1,V2),(V1,V3),(V1,V4) ... 
(K2, (V2,V3),(V2,V4),(V2,V5) ... 
... 
//PS. there are no duplicate elements like (V1,V2) == (V2,V1) 

我想會有一個30!每個鍵的操作,但如果可以優化它會更好。

回答

1

在Python,我們可以使用combinations()功能從包itertools內部mapValues()

from itertools import combinations 
rdd.mapValues(lambda x: list(combinations(x, 2))) 

在Scala中,我們可以以類似的方式使用combinations()方法。但由於它只是攝取和輸出對象類型Seq,我們必須一起鏈一對夫婦更多的方法來爲您預期的格式到達:

rdd.mapValues(_.toSeq.combinations(2).toArray.map{case Seq(x,y) => (x,y)}) 
+0

謝謝!它幫助了很多!^- ^ –