【问题标题】:Why df write console format not showing anything?为什么 df 写入控制台格式不显示任何内容?
【发布时间】:2020-04-26 19:05:07
【问题描述】:

我有一个静态数据框,如何将其写入控制台而不是使用df.show()

val sparkConfig = new SparkConf().setAppName("streaming-vertica").setMaster("local[2]")
val sparkSession = SparkSession.builder().master("local[2]").config(sparkConfig).getOrCreate()
val sc = sparkSession.sparkContext

val rows = sc.parallelize(Array(
  Row(1,"hello", true),
  Row(2,"goodbye", false)
))

val schema = StructType(Array(
  StructField("id",IntegerType, false),
  StructField("sings",StringType,true),
  StructField("still_here",BooleanType,true)
))

val df = sparkSession.createDataFrame(rows, schema) 

df.write
  .format("console")
  .mode("append")

这不会在控制台中写入任何内容:

 Using Spark's default log4j profile: org/apache/spark/log4j-defaults.properties
20/04/27 00:30:59 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable

Process finished with exit code 0

关于使用保存:

   df.write
      .format("console")
      .mode("append")
      .save()

它给出了:

使用 Spark 的默认 log4j 配置文件:org/apache/spark/log4j-defaults.properties 20/04/27 00:45:01 WARN NativeCodeLoader:无法为您的平台加载 native-hadoop 库...在适用的情况下使用内置 java 类 线程“主”java.lang.RuntimeException 中的异常:org.apache.spark.sql.execution.streaming.ConsoleSinkProvider 不允许创建表作为选择。 在 scala.sys.package$.error(package.scala:27​​) 在 org.apache.spark.sql.execution.datasources.DataSource.write(DataSource.scala:473) 在 org.apache.spark.sql.execution.datasources.SaveIntoDataSourceCommand.run(SaveIntoDataSourceCommand.scala:50) 在 org.apache.spark.sql.execution.command.ExecutedCommandExec.sideEffectResult$lzycompute(commands.scala:58) 在 org.apache.spark.sql.execution.command.ExecutedCommandExec.sideEffectResult(commands.scala:56) 在 org.apache.spark.sql.execution.command.ExecutedCommandExec.doExecute(commands.scala:74) 在 org.apache.spark.sql.execution.SparkPlan$$anonfun$execute$1.apply(SparkPlan.scala:117) 在 org.apache.spark.sql.execution.SparkPlan$$anonfun$execute$1.apply(SparkPlan.scala:117) 在 org.apache.spark.sql.execution.SparkPlan$$anonfun$executeQuery$1.apply(SparkPlan.scala:138) 在 org.apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:151) 在 org.apache.spark.sql.execution.SparkPlan.executeQuery(SparkPlan.scala:135) 在 org.apache.spark.sql.execution.SparkPlan.execute(SparkPlan.scala:116) 在 org.apache.spark.sql.execution.QueryExecution.toRdd$lzycompute(QueryExecution.scala:92) 在 org.apache.spark.sql.execution.QueryExecution.toRdd(QueryExecution.scala:92) 在 org.apache.spark.sql.DataFrameWriter.runCommand(DataFrameWriter.scala:609) 在 org.apache.spark.sql.DataFrameWriter.save(DataFrameWriter.scala:233) 在 rep.StaticDFWrite$.main(StaticDFWrite.scala:35) 在 rep.StaticDFWrite.main(StaticDFWrite.scala)

Spark 版本 = 2.2.1
scala 版本 = 2.11.12

【问题讨论】:

  • 你必须调用一个动作,Spark 很懒,你除了设置 writer 什么也没做。操作将是save
  • 为什么使用save@UninformedUser会出现异常
  • 为什么要保存到控制台?如果您只是打印到控制台进行调试,请使用show()
  • 我有一种情况,它写入数据库,在验证之前我需要检查一些东西,所以我把这段代码作为一个例子,看看每一行发生了什么,这就是我将它写入控制台以制作精确副本并分析情况的原因@DannyVarod

标签: scala dataframe apache-spark spark-streaming


【解决方案1】:

你必须在 DataFrameWriter 对象上调用save

如果没有保存方法,它只会创建 DataFrameWriter 对象并终止您的会话。

检查下面的代码,我已经检查了 spark-shell。

请注意,此代码适用于 spark 版本 2.4.0,但不适用于 2.2.0

控制台格式不适用于在 spark 2.2.0 中写入 - https://issues.apache.org/jira/browse/SPARK-20599

scala> df.write.format("console").mode("append")
res5: org.apache.spark.sql.DataFrameWriter[org.apache.spark.sql.Row] = org.apache.spark.sql.DataFrameWriter@148a3112

scala> df.write.format("console").mode("append").save()
+--------+---+
|    name|age|
+--------+---+
|srinivas| 20|
+--------+---+


【讨论】:

  • 它给出了一个使用 save @Srinivas 的例外
  • 为什么要投反对票.. 你在 DataFrameWriter 对象上调用了 save() 操作
  • 我不知道 downvote.. 但我在 intellij 中做了同样的事情并给出了例外
  • 您使用的是哪个版本的 spark ?
  • spark = 2.2.1 , scala = 2.11.12
猜你喜欢
  • 1970-01-01
  • 2014-07-12
  • 2014-01-13
  • 2011-04-12
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
  • 2018-11-02
  • 2012-05-30
相关资源
最近更新 更多