Com Spark 2.xe Scala 2.11
Eu pensaria em três maneiras possíveis de converter valores de uma coluna específica em Lista.
Snippets de código comuns para todas as abordagens
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")
Abordagem 1
df.select("id").collect().map(_(0)).toList
O que acontece agora? Estamos coletando dados para o Driver collect()
e escolhendo o elemento zero de cada registro.
Essa não poderia ser uma maneira excelente de fazer isso. Vamos melhorá-la na próxima abordagem.
Abordagem 2
df.select("id").rdd.map(r => r(0)).collect.toList
Como está melhor? Distribuímos a carga de transformação do mapa entre os trabalhadores, em vez de um único driver.
Eu sei rdd.map(r => r(0))
que não parece elegante você. Então, vamos abordar isso na próxima abordagem.
Abordagem 3
df.select("id").map(r => r.getString(0)).collect.toList
Aqui não estamos convertendo DataFrame em RDD. Observe map
que não aceita r => r(0)
(ou _(0)
) como a abordagem anterior devido a problemas de codificador no DataFrame. Então acabe usando r => r.getString(0)
e seria abordado nas próximas versões do Spark.
Conclusão
Todas as opções dão a mesma saída, mas 2 e 3 são eficazes, finalmente o terceiro é eficaz e elegante (eu acho).
Caderno Databricks