我目前正在尝试将Spark数据帧的执行计划存储到HDFS中(通过dataframe.explain(true)命令)
我发现的问题是,当我使用explain(true)命令时,我能够通过命令行和日志看到输出,但是如果我创建了一个文件(假设说a。 txt)用dataframe的内容解释文件将显示为空。
我认为这个问题与Spark的配置有关,但我无法做到 在互联网上找到关于此的任何信息
(对于那些想要使用explain函数查看更多有关数据帧计划执行情况的人,请参阅https://jaceklaskowski.gitbooks.io/mastering-apache-spark/spark-sql-dataset-operators.html#explain)
答案 0 :(得分:2)
如果我使用dataframe的内容解释
创建一个文件(假设为.txt)
你究竟是怎么做到的?
explain
使用println
将其结果写入控制台,然后返回Unit
,如Dataset.scala中所示:
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
}
}
所以,除非你redirect the console output to write to your file(以及打印到控制台的任何其他内容......),否则你将无法将explain
的输出写入文件。
答案 1 :(得分:0)
我找到的最佳方法是在运行作业时将输出重定向到文件。我使用了以下命令:
spark-shell --master yarn -i test.scala > getlogs.log
我的scala文件包含以下简单命令:
val df = sqlContext.sql("SELECT COUNT(*) FROM testtable")
df.explain(true)
exit()