2014-04-17 3 views
21

In Scala kann ich eine Sammlung abflachen mit:Wie man eine Sammlung mit Spark/Scala glätten?

val array = Array(List("1,2,3").iterator,List("1,4,5").iterator) 
                //> array : Array[Iterator[String]] = Array(non-empty iterator, non-empty itera 
                //| tor) 


    array.toList.flatten      //> res0: List[String] = List(1,2,3, 1,4,5) 

Aber wie kann ich in Funken ähnlich durchführen?

Lesen der API doc http://spark.apache.org/docs/0.7.3/api/core/index.html#spark.RDD es scheint nicht eine Methode, die diese Funktionalität bietet?

Antwort

29

Try flatMap mit einer Identitätskartenfunktion (y => y):

scala> val x = sc.parallelize(List(List("a"), List("b"), List("c", "d"))) 
x: org.apache.spark.rdd.RDD[List[String]] = ParallelCollectionRDD[1] at parallelize at <console>:12 

scala> x.collect() 
res0: Array[List[String]] = Array(List(a), List(b), List(c, d)) 

scala> x.flatMap(y => y) 
res3: org.apache.spark.rdd.RDD[String] = FlatMappedRDD[3] at flatMap at <console>:15 

scala> x.flatMap(y => y).collect() 
res4: Array[String] = Array(a, b, c, d) 
+0

Obwohl dies funktional korrekt ist, würde diese Lösung nicht verteilt werden und würde einen Engpass beim Treiber/Master verursachen. Die Lösung von samthebest ist viel besser. – ldmtwo

+6

@ user3746632: Die 'collect()' Aufrufe waren nur zu Illustrationszwecken, um zu zeigen, dass die Ergebnisse tatsächlich abgeflacht wurden. –

32

Verwenden flatMap und die identityPredef ist dies besser lesbar als x => x, z.B.

+0

Das Predef-Objekt stellt Definitionen bereit, die in allen Scala-Übersetzungseinheiten ohne explizite Qualifizierung zugänglich sind (http://www.scala-lang.org/api/2.12.x/scala/Predef$.html). – ecoe