关于scala:存储Spark的dataframe的执行计划

Store execution plan of Spark′s dataframe

我目前正在尝试将 Spark 的数据帧的执行计划存储到 HDFS 中(通过 dataframe.explain(true) 命令)

我发现的问题是,当我使用 explain(true) 命令时,我可以通过命令行和日志查看输出,但是如果我创建一个文件(比如说 . txt) 与数据框的说明文件的内容将显示为空。

我认为该问题与 Spark 的配置有关,但我无法解决
在互联网上找到有关此的任何信息

(对于那些想了解更多关于使用解释功能执行数据帧的计划的人,请参阅 https://jaceklaskowski.gitbooks.io/mastering-apache-spark/spark-sql-dataset-operators.html #解释)


if I create a file (let′s say a .txt) with the content of the dataframe′s explain

您究竟是如何尝试实现这一目标的?

explain 使用 println 将其结果写入控制台,并返回 Unit,如 Dataset.scala:

所示

1
2
3
4
5
6
7
8
def explain(extended: Boolean): Unit = {
  val explain = ExplainCommand(queryExecution.logical, extended = extended)
  sparkSession.sessionState.executePlan(explain).executedPlan.executeCollect().foreach {
    // scalastyle:off println
    r => println(r.getString(0))
    // scalastyle:on println
  }
}

因此,除非您重定向控制台输出以写入文件(以及打印到控制台的任何其他内容...),否则您将无法将 explain 的输出写入文件。


我发现的最佳方法是在运行作业时将输出重定向到文件。我使用了以下命令:

1
 spark-shell --master yarn -i test.scala > getlogs.log

我的 scala 文件有以下简单的命令:

1
2
3
val df = sqlContext.sql("SELECT COUNT(*) FROM testtable")
df.explain(true)
exit()