Развертывание списка для выбора нескольких столбцов из кадра искровых данных
У меня есть световой кадр df
. Есть ли способ подбора нескольких колонок, используя список этих столбцов?
scala> df.columns
res0: Array[String] = Array("a", "b", "c", "d")
Я знаю, что могу сделать что-то вроде df.select("b", "c")
. Но предположим, что у меня есть список, содержащий несколько имен столбцов val cols = List("b", "c")
, есть ли способ передать это df.select? df.select(cols)
выдает ошибку. Что-то вроде df.select(*cols)
как в python
Ответы
Ответ 1
Используйте df.select(cols.head, cols.tail: _*)
Сообщите мне, если это работает:)
Объяснение из @Ben:
Ключ является сигнатурой метода select:
select(col: String, cols: String*)
Запись cols:String*
принимает переменное количество аргументов. :_*
распаковывает аргументы, чтобы они могли обрабатываться этим аргументом. Очень похоже на распаковку в python с *args
. Подробнее см. здесь и здесь.
Ответ 2
Вы можете привести строку String в колонку с таким названием:
import org.apache.spark.sql.functions._
df.select(cols.map(col): _*)
Ответ 3
Еще один вариант, который я только что узнал.
import org.apache.spark.sql.functions.col
val columns = Seq[String]("col1", "col2", "col3")
val colNames = columns.map(name => col(name))
val df = df.select(colNames:_*)
Ответ 4
Вы можете передать аргументы типа Column*
в select
:
val df = spark.read.json("example.json")
val cols: List[String] = List("a", "b")
//convert string to Column
val col: List[Column] = cols.map(df(_))
df.select(col:_*)