不了解更新模式和水印

beq87vna  于 2021-07-13  发布在  Spark
关注(0)|答案(1)|浏览(313)

据我所知,水印是最后看到的事件时间延迟阈值。因此,如果最后看到的事件时间是12:11,延迟阈值是10分钟,则水印是12:01。因为12:01比12:00的窗口开始时间晚,所以它的状态被丢弃。
但我写了一个问题:

stream
  .withWatermark("created", "2 seconds")
  .groupBy(
    window($"created", "2 seconds", "2 seconds"),
    $"animal"
  )
  .count()
  .writeStream
  .format("console")
  .outputMode(OutputMode.Update())

以及输出:

[2021-02-22 16:06:40.0,2021-02-22 16:06:42.0]:dog
[2021-02-22 16:06:40.0,2021-02-22 16:06:42.0]:owl
[2021-02-22 16:06:40.0,2021-02-22 16:06:42.0]:cat
[2021-02-22 16:06:34.0,2021-02-22 16:06:36.0]:pig

上次事件时间: 2021-02-22 16:06:41.696 在窗口中40-42秒
清管器时间: 2021-02-22 16:06:35.696 aa你可以看到,Pig存在于34-36窗口,但阈值是2秒。
为什么我能看到输出?
有趣的是:如果我和其他事件同时按下pig,但是使用旧的时间戳,那么这个事件将被添加到结果集中。但是如果在2秒(基本要求)后使用相同的时间戳推送事件,它将不会显示在结果集中。

yfwxisqw

yfwxisqw1#

我将所有数据一批推送到流中。当时,还没有水印,所以我可以在结果集中看到旧事件。如果我将一些数据推送到流中,设置processingtime,例如100ms,100ms之后将推送旧数据,结果将是预期的。

相关问题