Как получить искровой датафрейм для печати, он объясняет план в строку - PullRequest
2 голосов
/ 10 апреля 2019

У меня есть система, в которой компонент A передает sql компоненту B, B затем запускает sql через apache spark и возвращает результат.

В целях отладки я помещаю второй канал связи, где A может передать sql B и запросить и объяснить план.

Код в B выглядит примерно так:

def handleExplain(sql: String, extended: Boolean): String = {
    val dataFrame = sparkContext.sql(sql)
    dataFrame.explain(extended)
}

Проблема в том, что объяснение не возвращает строку, а просто выводит план объяснения на консоль. Как получить содержимое строки того, что напечатано на консоли? Есть ли другая функция, или мне нужно поднять ее с консоли?

Ответы [ 3 ]

1 голос
/ 10 апреля 2019

Предполагая spark: SparkSession, что-то вроде

def handleExplain(sql: String, extended: Boolean): String = {
  val dataFrame = spark.sql(sql)
  import org.apache.spark.sql.execution.command.ExplainCommand
  spark
    .sessionState
    .executePlan(ExplainCommand(dataFrame.queryExecution.logical, extended))
    .executedPlan
    .executeCollect()
    .map(_.getString(0))
    .mkString("\n")
}

На основе https://github.com/apache/spark/blob/master/sql/core/src/main/scala/org/apache/spark/sql/Dataset.scala#L499

0 голосов
/ 10 апреля 2019

Все планы запросов, включая строковое представление, доступны через соответствующий объект QueryExecution.Например, чтобы получить полный план выполнения:

val ds: Dataset[_] = ???

ds.queryExecution.toString

только логический план:

ds.queryExecution.logical.toString

оптимизированный логический план:

ds.queryExecution.optimizedPlan.toString

или выполненный / физический план:

ds.queryExecution.executedPlan
0 голосов
/ 10 апреля 2019

Поскольку вы уже запускаете операторы SQL для запуска, вы можете просто добавить EXPLAIN или EXPLAIN EXTENDED к вашему выражению sql

def handleExplain(sql: String, extended: Boolean): String = {
    val explain = if (extended) "EXPLAIN EXTENDED" else "EXPLAIN"
    sparkContext.sql(s"$explain $sql").as[String].collect.mkString
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...