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 ...我如何才能像在控制台中那样获得结果?
非常感谢 !
很久以前,但我自己也遇到过这个问题,并认为我会解决它。事实上,我认为你的代码很好,直到你尝试将数据放入 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)
当您附加最新值并将文件输出到特定的输出目录时,应该可以解决空文件问题。
| 归档时间: |
|
| 查看次数: |
8314 次 |
| 最近记录: |