在Spark Structured Streaming中的水印间隔之后写入记录一次

时间:2018-03-30 00:46:48

标签: scala apache-spark spark-structured-streaming

我有以下查询:

val ds = dataFrame
  .filter(! $"requri".endsWith(".m3u8"))
  .filter(! $"bserver".contains("trimmer"))
  .withWatermark("time", "120 seconds")
  .groupBy(window(dataFrame.col("time"),"60 seconds"),col("channelName"))
  .agg(sum("bytes")/1000000 as "byte_count")

如何实现foreach编写器,以便每个水印间隔仅触发一次其处理方法。即在上述例子中,我将得到以下内容

10.00-10.01 Channel-1 100(bytes)
10.00-10.01 Channel-2 120(bytes)
10.01-10.02 Channel-1 110(bytes)

1 个答案:

答案 0 :(得分:1)

要为每个水印间隔触发一次处理方法,您可以使用ProcessingTime("120 seconds")。像这样:

val query = ds.writeStream
              .format("console")
              .trigger(Trigger.ProcessingTime("120 seconds"))
              .start()

流式查询的触发器设置定义了流式数据处理的时间,无论查询是作为具有固定批处理间隔的微批量查询执行还是作为连续处理查询执行。