Con Spark 2.xe Scala 2.11
Penserei a 3 possibili modi per convertire i valori di una colonna specifica in List.
Frammenti di codice comuni per tutti gli approcci
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")
Approccio 1
df.select("id").collect().map(_(0)).toList
Che succede ora? Stiamo raccogliendo dati a Driver con collect()
e selezionando l'elemento zero da ogni record.
Questo non potrebbe essere un modo eccellente per farlo, miglioriamolo con il prossimo approccio.
Approccio 2
df.select("id").rdd.map(r => r(0)).collect.toList
Come è meglio? Abbiamo distribuito il carico di trasformazione della mappa tra i lavoratori anziché il singolo Driver.
Lo so che rdd.map(r => r(0))
non ti sembra elegante. Quindi, affrontiamolo nel prossimo approccio.
Approccio 3
df.select("id").map(r => r.getString(0)).collect.toList
Qui non stiamo convertendo DataFrame in RDD. Guarda map
che non accetterà r => r(0)
(o _(0)
) come l'approccio precedente a causa di problemi del codificatore in DataFrame. Quindi finisci per usare r => r.getString(0)
e verrebbe affrontato nelle prossime versioni di Spark.
Conclusione
Tutte le opzioni danno lo stesso output ma 2 e 3 sono efficaci, infine la terza è efficace ed elegante (penso).
Taccuino di Databricks