Вы можете использовать что-то вроде этого для генерации списка столбцов на основе схемы:
import org.apache.spark.sql.types.{StructField, StructType}
def getStructFieldName(f: StructField, baseName: String = ""): Seq[String] = {
val bname = if (baseName.isEmpty) "" else baseName + "."
f.dataType match {
case StructType(s) =>
s.flatMap(x => getStructFieldName(x, bname + f.name))
case _ => Seq(bname + f.name)
}
}
Затем это можно было бы использовать в реальном фрейме данных, например:
val data = spark.read.json("some_data.json")
val cols = data.schema.flatMap(x => getStructFieldName(x))
в результате мы получаем последовательность строк, которую мы можем использовать либо для выполнения select
:
import org.apache.spark.sql.functions.col
data.select(cols.map(col): _*)
, либо мы можем сгенерировать список, разделенный запятыми, который мы можем использовать в spark.sql
:
spark.sql(s"select ${cols.mkString(", ")} from table")