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

时间:2018-09-11 14:00:12

标签: scala spark-streaming

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

Inputstream由文本文件目录构成:

ERROR:  total size of jsonb array elements exceeds the maximum of 268435455 bytes

然后解析日志...

// == Input == //

val logsDF = spark.readStream
  .format("text")
  .option("maxFilesPerTrigger", 1)
  .load("input/*")

...并汇总

// == Parsing == //

val logsDF2 = ...

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

// == Aggregation == //

val windowedCounts = logsDF2
  .withWatermark("window_start", "15 minutes")
  .groupBy(
    col("window"),
    col("node")
  ).count()

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

// == Output == //

val query = windowedCounts.writeStream
  .format("console")
  .outputMode("complete")
  .start()
  .awaitTermination()

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

非常感谢您!

1 个答案:

答案 0 :(得分:2)

很久以前,但是我自己遇到了这个问题,并认为我会解决。确实,我认为您的代码是好的,除非您尝试将数据下沉到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")

应在添加最新值并将文件输出到特定输出目录时解决空文件问题。