2017-03-05 2 views
1

// J'utilise Spark 2,01 //Comment puis-je effectuer ce type de produit cartésien dans étincelle 2,01

Et mes données ressemble,

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

et je veux créer un valeur de la liste de produits cartésiens pour la valeur de chaque clé.

(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) 

Et je pense qu'il y aura un 30! Opération pour chaque touche, mais ce serait mieux si elle pouvait être optimisée.

Répondre

1

En Python, nous pouvons utiliser combinations() fonction de l'emballage intérieur itertoolsmapValues():

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

En Scala, nous pouvons utiliser la méthode combinations() d'une manière similaire. Mais parce qu'il n'ingère et des objets sorties de type Seq, nous allons devoir enchaîner deux ou trois autres méthodes pour arriver à votre format attendu:

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

Merci! Ça a beaucoup aidé!^- ^ –