Con Spark 2.xy Scala 2.11
Pensaría en 3 formas posibles de convertir valores de una columna específica en List.
Fragmentos de código comunes para todos los enfoques
import org.apache.spark.sql.SparkSession
val spark = SparkSession.builder.getOrCreate
import spark.implicits._
val df = Seq(
("first", 2.0),
("test", 1.5),
("choose", 8.0)
).toDF("id", "val")
Enfoque 1
df.select("id").collect().map(_(0)).toList
¿Que pasa ahora? Estamos recopilando datos para Driver collect()
y seleccionando el elemento cero de cada registro.
Esta no podría ser una excelente manera de hacerlo, mejorémosla con el siguiente enfoque.
Enfoque 2
df.select("id").rdd.map(r => r(0)).collect.toList
¿Cómo es mejor? Hemos distribuido la carga de transformación de mapas entre los trabajadores en lugar de un solo controlador.
Sé que rdd.map(r => r(0))
no te parece elegante. Entonces, abordemos esto en el siguiente enfoque.
Enfoque 3
df.select("id").map(r => r.getString(0)).collect.toList
Aquí no estamos convirtiendo DataFrame a RDD. Mire map
que no aceptará r => r(0)
(o _(0)
) como el enfoque anterior debido a problemas del codificador en DataFrame. Así que termine usándolo r => r.getString(0)
y se abordará en las próximas versiones de Spark.
Conclusión
Todas las opciones dan el mismo resultado, pero 2 y 3 son efectivas, finalmente la tercera es efectiva y elegante (creo).
Cuaderno de Databricks