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 mapque 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