Spark 结构化流 writeStream 输出一个全局 csv

Noa*_* Be 4 scala spark-streaming

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

输入流由文本文件目录组成:

// == Input == //

val logsDF = spark.readStream
  .format("text")
  .option("maxFilesPerTrigger", 1)
  .load("input/*")
Run Code Online (Sandbox Code Playgroud)

然后解析日志...

// == Parsing == //

val logsDF2 = ...
Run Code Online (Sandbox Code Playgroud)

...并汇总

// == Aggregation == //

val windowedCounts = logsDF2
  .withWatermark("window_start", "15 minutes")
  .groupBy(
    col("window"),
    col("node")
  ).count()
Run Code Online (Sandbox Code Playgroud)

当我使用“控制台”接收器时,一切工作正常:结果在控制台中按浴批量更新:

// == Output == //

val query = windowedCounts.writeStream
  .format("console")
  .outputMode("complete")
  .start()
  .awaitTermination()
Run Code Online (Sandbox Code Playgroud)

现在我想将结果保存在一个唯一的文件中(json、parquet、csv ..)

// == Output == //

val query = windowedCounts.writeStream
  .format("csv")
  .option("checkpointLocation", "checkpoint/")
  .start("output/")
  .awaitTermination()
Run Code Online (Sandbox Code Playgroud)

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

非常感谢 !

FVC*_*VCC 5

很久以前,但我自己也遇到过这个问题,并认为我会解决它。事实上,我认为你的代码很好,直到你尝试将数据放入 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()
Run Code Online (Sandbox Code Playgroud)

该行:

.trigger(processingTime="10 seconds")
Run Code Online (Sandbox Code Playgroud)

应该可以解决您的 400 个文件,因为它每 10 秒只写入一个新文件。这两行:

.option("path", "output_path/")
.outputMode("append")
Run Code Online (Sandbox Code Playgroud)

当您附加最新值并将文件输出到特定的输出目录时,应该可以解决空文件问题。