В 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