Mapear RDDs en Scala

Mapear – map()scala_logo

Nos devuelve un RDD después de aplicar una función de transformación al RDD original.
val rdd1 = sc.parallelize(List(1,2,3,4,5,6,7,8,9))
val rdd2 = rdd1.map(_ * 2)
rdd2.collect
res: Array[Int] = Array(2, 4, 6, 8, 10, 12, 14, 16, 18)

Mapear 2 – flatMap()

Similar a la función map, pero la función devuelve una secuencia de valores

val rdd1 = sc.parallelize(List("En un lugar de la mancha",  "de cuyo nombre no quiero acordarme"))
 val rdd2 = rdd1.map(x => x.split(" ")) // split(" ") returns an array of words
 rdd2.collect()
val rdd3 = rdd1.flatMap(x => x.split(" "))
 rdd3.collect()
res2: Array[Array[String]] = Array(Array(En, un, lugar, de, la, mancha), Array(de, cuyo, nombre, no, quiero, acordarme))
res3: Array[String] = Array(En, un, lugar, de, la, mancha, de, cuyo, nombre, no, quiero, acordarme)

Mapear por partición – mapPartitions()

 Similar a la función map, pero se ejecuta por separado en cada partición del RDD
val rdd = sc.parallelize(List("a","b","c","d","e","f"),3)
def myfunc(index: Int, iter: Iterator[(String)]) : Iterator[String] = {
  iter.map(x => "[id de partición:" +  index + ", valor: " + x + "]")
}
rdd.mapPartitionsWithIndex(myfunc).collect
res: Array[String] = Array([id de partición:0, valor: a], [id de partición:0, valor: b], [id de partición:1, valor: c], [id de partición:1, valor: d], [id de partición:2, valor: e], [id de partición:2, valor: f])

Otros artículos que pueden ser de interés:

Autor: Diego Calvo