存储Spark的数据帧

时间:2017-08-31 12:41:27

标签: scala apache-spark dataframe apache-spark-sql

我目前正在尝试将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

2 个答案:

答案 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()