Comment aplatir une collection avec Spark / Scala?

Dans Scala, je peux aplatir une collection en utilisant:

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)

Mais comment puis-je effectuer similaire dans Spark ?

Lecture du document API http://spark.apache.org/docs/0.7.3/api/core/index.html#spark.RDD Il ne semble pas y avoir une méthode qui fournit cette fonctionnalité ?

21
demandé sur blue-sky 2014-04-17 20:14:36

2 réponses

Essayez flatMap avec une fonction de carte d'identité (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)
30
répondu Josh Rosen 2014-04-17 17:06:10

Utilisez flatMap et le identity Predef, Ceci est plus lisible que d'utiliser x => x, par exemple

myRdd.flatMap(identity)
33
répondu samthebest 2014-05-12 11:02:53