Как получить столбцы запроса spark sql без выполнения - PullRequest
1 голос
/ 11 марта 2020

Я хочу извлечь столбцы из запроса spark sql, не выполняя его. С parsePlan:

val logicalPlan = spark.sessionState.sqlParser.parsePlan(query)
logicalPlan.collect{
    case p: Project => p.projectList.map(_.name)
}.flatten

я смог извлечь список столбцов. Однако это не работает в случае Select * и выдает исключение со следующим сообщением: An exception or error caused a run to abort: Invalid call to name on unresolved object, tree: *.

1 Ответ

1 голос
/ 21 марта 2020

Без какой-либо формы выполнения Spark не может определить столбцы. Например, если таблица была загружена из CSV-файла

spark.read.option("header",true).csv("data.csv").createOrReplaceTempView("csvTable")

, тогда запрос

select * from csvTable

не сможет прочитать имена столбцов без чтения (по крайней мере, в первой строке) файла csv.

Извлечение небольшого количества кода из команды объяснения Spark следующие строки максимально приближены к ответу на вопрос:

val logicalPlan: LogicalPlan = spark.sessionState.sqlParser.parsePlan("select * from csvTable")
val queryExecution: QueryExecution = spark.sessionState.executePlan(logicalPlan)
val outputAttr: Seq[Attribute] = queryExecution.sparkPlan.output
val colNames: Seq[String] = outputAttr.map(a => a.name)
println(colNames)

Если файл data.csv содержит столбцы a и b, код печатает

List(a, b)

Отказ от ответственности : QueryExecution не считается общедоступным c классом, который может использоваться разработчиками приложений. На данный момент (Spark версия 2.4.5) приведенный выше код работает, но он не гарантированно будет работать в будущих версиях.

...