【发布时间】: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