为什么超出水印的迟到事件没有被拒绝

时间:2019-10-01 17:39:06

标签: apache-spark spark-structured-streaming

我使用Spark 2.4.3。

迟到的数据未被拒绝。

我正在使用结构化流从文件夹中读取文件。我希望可以将延迟到达的数据排除在外,但仍会计算在内。

case class InputRow(...)

val df = spark.readStream
      .format("csv")
      .option("delimiter", ",")
      .schema(schema)
      .csv("/somefolder/")
... 
df.as[InputRow]
      .withWatermark("eventtime", "5 seconds")
      .groupBy($"eventid")
      .count()
      .writeStream.format("console")
      .trigger(Trigger.ProcessingTime("3 seconds"))
      .option("truncate", false)
      .outputMode("update")
      .start
      .awaitTermination()

我第一次将文件放在一行中,例如: 2019-08-04 10:10:00,1,3328,c1,10,1000

这里的事件ID是3328。输出为:

-------------------------------------------
Batch: 0
-------------------------------------------
+-------+-----+
|eventid|count|
+-------+-----+
|3328   |1    |
+-------+-----+

-------------------------------------------
Batch: 1
-------------------------------------------
+-------+-----+
|eventid|count|
+-------+-----+
+-------+-----+

然后,我将另一个文件放在一行中,例如: 2019-08-02 10:10:00,1,3328,c1,10,1000 eventid相同,但是eventtime更改为8/2,这显然超出水印范围(到目前为止,最长时间为5秒),但是输出为:

-------------------------------------------
Batch: 2
-------------------------------------------
+-------+-----+
|eventid|count|
+-------+-----+
|3328   |2    |
+-------+-----+

那么问题:

  1. 对于第一个文件,为什么有2个批次而一个批次为空?
  2. 为什么超出水印的迟到数据不会被拒绝而仍会被汇总?

谢谢!

0 个答案:

没有答案