web-dev-qa-db-fra.com

Comment aplatir la liste dans RDD?

Est-il possible d'aplatir la liste dans RDD? Par exemple convertir:

 val xxx: org.Apache.spark.rdd.RDD[List[Foo]]

à:

 val yyy: org.Apache.spark.rdd.RDD[Foo]

Comment faire ça?

13
zork
val rdd = sc.parallelize(Array(List(1,2,3), List(4,5,6), List(7,8,9), List(10, 11, 12)))
// org.Apache.spark.rdd.RDD[List[Int]] = ParallelCollectionRDD ...

val rddi = rdd.flatMap(list => list)
// rddi: org.Apache.spark.rdd.RDD[Int] = FlatMappedRDD ...

// which is same as rdd.flatMap(identity)
// identity is a method defined in Predef object.
//    def identity[A](x: A): A

rddi.collect()
// res2: Array[Int] = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12)
13
Shyamendra Solanki

Vous avez juste besoin de l'aplatir, mais comme il n'y a pas de méthode explicite 'd'aplatissement' sur RDD, vous pouvez le faire:

rdd.flatMap(identity)
13
maasg

Vous pouvez pimp la classe RDD pour attacher une méthode .flatten (afin de suivre la List api):

object SparkHelper {
  implicit class SeqRDDExtensions[T: ClassTag](val rdd: RDD[Seq[T]]) {
    def flatten: RDD[T] = rdd.flatMap(identity)
  }
}

qui peuvent alors être simplement utilisés comme tels:

rdd.flatten
0
Xavier Guihot