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)
假设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)
| 归档时间: |
|
| 查看次数: |
6076 次 |
| 最近记录: |