Z Spark 2.x i Scala 2.11
Wymyśliłbym 3 możliwe sposoby konwersji wartości określonej kolumny na Listę.
Wspólne fragmenty kodu dla wszystkich podejść
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")
Podejście 1
df.select("id").collect().map(_(0)).toList
Co się teraz stanie? Zbieramy dane do Kierowcy collect()
i wybieramy element zerowy z każdego rekordu.
To nie może być doskonały sposób na zrobienie tego. Poprawmy to następnym podejściem.
Podejście 2
df.select("id").rdd.map(r => r(0)).collect.toList
Jak to jest lepsze? Rozłożyliśmy obciążenie związane z transformacją mapy na pracowników, a nie na jednego kierowcę.
Wiem, rdd.map(r => r(0))
że nie wydaje ci się elegancka. Więc zajmijmy się tym w następnym podejściu.
Podejście 3
df.select("id").map(r => r.getString(0)).collect.toList
Tutaj nie konwertujemy DataFrame na RDD. Spójrz na map
to, że nie zaakceptuje r => r(0)
(lub _(0)
) jak poprzednie podejście z powodu problemów z koderem w DataFrame. Skończ więc z używaniem r => r.getString(0)
i zostanie to rozwiązane w następnych wersjach Spark.
Wniosek
Wszystkie opcje dają taką samą wydajność, ale 2 i 3 są efektywne, w końcu trzecia jest skuteczna i elegancka (tak mi się wydaje).
Notatnik Databricks