Подтвердить что ты не робот

Развертывание списка для выбора нескольких столбцов из кадра искровых данных

У меня есть световой кадр 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

4b9b3361

Ответ 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:_*)