З Spark 2.x та Scala 2.11
Я б подумав про 3 можливі способи перетворення значень конкретного стовпця в Список.
Загальні фрагменти коду для всіх підходів
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")
Підхід 1
df.select("id").collect().map(_(0)).toList
Що відбувається зараз? Ми збираємо дані Драйверу з collect()
і вибираємо нульовий елемент з кожного запису.
Це не може бути чудовим способом зробити це. Давайте вдосконалимо його наступним підходом.
Підхід 2
df.select("id").rdd.map(r => r(0)).collect.toList
Як це краще? Ми розподілили навантаження на перетворення карти серед робітників, а не одного драйвера.
Я знаю, rdd.map(r => r(0))
це не здається вам елегантним. Отже, давайте розглянемо це в наступному підході.
Підхід 3
df.select("id").map(r => r.getString(0)).collect.toList
Тут ми не перетворюємо DataFrame на RDD. Подивіться, map
він не прийме r => r(0)
(або _(0)
) як попередній підхід через проблеми з кодером у DataFrame. Тож у кінцевому підсумку використовуйте, r => r.getString(0)
і це буде розглянуто в наступних версіях Spark.
Висновок
Усі варіанти дають однакові результати, але ефективні 2 і 3, нарешті 3-й - ефективний і елегантний (я думаю).
Databricks ноутбук