2016-07-19 6 views

Antwort

4

:

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

Gibst du:

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

Dank, es funktionierte! – kambiz

+0

@kambiz Sie sind willkommen. –

+0

Was ist, wenn das zweite Array eine HashMap ist? Ich habe die gleiche Funktion versucht. Die Ergebnisse geben nur das erste Element der Karte zurück. – kambiz

2

Sie können auf jeden Fall brauchen flatMap zu verwenden, wie Sie erwähnt haben, sondern darüber hinaus, müssen Sie scala verwenden map auch.

Zum Beispiel:

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

Fehler: falsche Anzahl der Parameter; erwartet = 1 (siehe vorheriger Kommentar) – kambiz

0

Funktion einzelner Parameter verwenden:

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