我如何获得一个火花数据帧来打印它的解释计划到一个字符串

And*_*ndy 6 scala dataframe apache-spark

我有一个系统,其中组件 A 将 sql 传递给组件 B,然后 B 通过 apache spark 运行 sql,并返回结果。

出于调试目的,我正在设置第二个通信通道,A 可以在其中将 sql 传递给 B 并请求和解释计划。

B 中的代码如下所示:

def handleExplain(sql: String, extended: Boolean): String = {
    val dataFrame = sparkContext.sql(sql)
    dataFrame.explain(extended)
}
Run Code Online (Sandbox Code Playgroud)

问题是“explain”不返回字符串,它只是将解释计划打印到控制台。如何获取打印到控制台的字符串内容?是否有其他功能,或者我必须从控制台中取出它?

use*_*362 11

所有查询计划,包括字符串表示,都可以通过相应的QueryExecution对象进行访问。例如要获取完整的执行计划:

val ds: Dataset[_] = ???

ds.queryExecution.toString
Run Code Online (Sandbox Code Playgroud)

唯一合乎逻辑的计划:

ds.queryExecution.logical.toString
Run Code Online (Sandbox Code Playgroud)

优化逻辑计划:

ds.queryExecution.optimizedPlan.toString
Run Code Online (Sandbox Code Playgroud)

或执行/物理计划:

ds.queryExecution.executedPlan
Run Code Online (Sandbox Code Playgroud)


oll*_*ik1 1

假设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")
}
Run Code Online (Sandbox Code Playgroud)

基于https://github.com/apache/spark/blob/master/sql/core/src/main/scala/org/apache/spark/sql/Dataset.scala#L499