Scala Spark Structured Streaming writeStream输出一个全局csv

Scala Spark Structured Streaming writeStream输出一个全局csv,scala,spark-streaming,Scala,Spark Streaming,我目前正在使用Spark结构化流媒体制作一个原始日志数据聚合器 Inputstream由一个文本文件目录组成: // == Input == // val logsDF = spark.readStream .format("text") .option("maxFilesPerTrigger", 1) .load("input/*") 然后解析日志 // == Parsing == // val logsDF2 = ... 。。。和聚合 // == Aggregation

我目前正在使用Spark结构化流媒体制作一个原始日志数据聚合器

Inputstream由一个文本文件目录组成:

// == Input == //

val logsDF = spark.readStream
  .format("text")
  .option("maxFilesPerTrigger", 1)
  .load("input/*")
然后解析日志

// == Parsing == //

val logsDF2 = ...
。。。和聚合

// == Aggregation == //

val windowedCounts = logsDF2
  .withWatermark("window_start", "15 minutes")
  .groupBy(
    col("window"),
    col("node")
  ).count()
当我使用“控制台”接收器时,一切正常:结果在控制台中逐批更新:

// == Output == //

val query = windowedCounts.writeStream
  .format("console")
  .outputMode("complete")
  .start()
  .awaitTermination()
现在我想将结果保存在一个唯一的文件中(json、拼花、csv..)

但它输出400个空csv。。。如何才能像在控制台中那样获得结果


多谢各位

很久以前,但我自己也经历了这个问题,并认为我会解决它。事实上,我认为您的代码是好的,直到您尝试将数据放入csv文件。尝试将writeStream csv代码更改为:

// == Output == //
val query = windowedCounts.writeStream
  .format("csv")
  .trigger(processingTime="10 seconds")
  .option("checkpointLocation", "checkpoint/")
  .option("path", "output_path/")
  .outputMode("append")
  .start()
  .awaitTermination()
该行:

.trigger(processingTime="10 seconds")
应该解决400个文件,因为它每10秒只写一个新文件。这两条线:

.option("path", "output_path/")
.outputMode("append")
在附加最新值并将文件输出到特定的输出目录时,应解决空文件问题

.option("path", "output_path/")
.outputMode("append")