2017-10-08 4 views
-1

J'ai un RDD comme celui-ci (tous les chiffres sont Int):comment générer des combinaisons de clés, des paires de valeurs dans étincelle apache (scala)

(2,List(2,2,7)) 
(7,List(9,7,9)) 
(9,List(2,7,9)) 

Comment générer un RDD tel que pour chaque liste que nous ont toutes les possibilités de clés:

(2,List(2,2,7)) 
(7,List(2,2,7)) 
(9,List(2,2,7)) 
(2,List(9,7,9)) 
(7,List(9,7,9)) 
(9,List(9,7,9)) 
(2,List(2,7,9)) 
(7,List(2,7,9)) 
(9,List(2,7,9)) 

Suivi, je dois calculer les chiffres correspondant à chaque ligne lorsque la valeur clé est égale aux valeurs de la liste, par exemple,

(2,List(2,2,7)) results in (2, 2) since there are two 2s in the list 
(7,List(2,2,7)) results in (7, 1) since there is one 7 in the list 

Répondre

1

Pour générer toutes les paires possibles clé-valeur j'utiliser quelque chose comme

rdd.map(_._1).cartesian(rdd.map(_._2))

qui donne exactement

(2,List(9, 7, 9)) 
(2,List(2, 7, 9)) 
(7,List(2, 2, 7)) 
(7,List(9, 7, 9)) 
(7,List(2, 7, 9)) 
(9,List(2, 2, 7)) 
(9,List(9, 7, 9)) 
(9,List(2, 7, 9)) 
(2,List(2, 2, 7)) 

Pour un résultat final, vous pouvez utiliser la carte:

rdd.map(_._1).cartesian(rdd.map(_._2)).map{case (k, v) => {(k, v, v.count(_ == k))}} 

(2,List(2, 2, 7),2) 
(2,List(2, 7, 9),1) 
(7,List(2, 7, 9),1) 
(2,List(9, 7, 9),0) 
(7,List(2, 2, 7),1) 
(9,List(2, 2, 7),0) 
(9,List(9, 7, 9),2) 
(7,List(9, 7, 9),1) 
(9,List(2, 7, 9),1) 

Vous peut exclure la liste elle-même des tuples finaux, je l'ai ajouté juste pour vérifier si cela fonctionne bien. En ce qui concerne votre problème, il peut être très utile de vérifier que la liste est null et de la gérer correctement