2016-07-19 1 views

Répondre

4

Ce:

vector.flatMap { case (x, arr) => arr.map((x, _)) } 

vous donnera:

scala> val vector = sc.parallelize(Vector(("a", Array("b", "c")), ("b", Array("d", "f")))) 
vector: org.apache.spark.rdd.RDD[(String, Array[String])] = 
       ParallelCollectionRDD[3] at parallelize at <console>:27 


scala> vector.flatMap { case (x, arr) => arr.map((x, _)) }.collect 
res4: Array[(String, String)] = Array((a,b), (a,c), (b,d), (b,f)) 
+0

Merci, ça a marché! – kambiz

+0

@kambiz Bienvenue. –

+0

Que faire si le deuxième tableau est un HashMap? J'ai essayé la même fonction. Les résultats ne font que renvoyer le premier élément de la carte. – kambiz

2

Vous pouvez certainement besoin d'utiliser flatMap comme vous l'avez mentionné, mais en plus, vous devez utiliser scala map ainsi.

Par exemple:

val idToVectorValue: RDD[(String, String ] = vector.flatMap((id,values) => values.map(value => (id, value))) 
+0

erreur: mauvais nombre de paramètres; attendu = 1 (voir le commentaire précédent) – kambiz

0

En utilisant seule fonction de paramètres:

vector.flatMap(data => data._2.map((data._1, _)))