据我所知,水印是最后看到的事件时间延迟阈值。因此,如果最后看到的事件时间是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秒(基本要求)后使用相同的时间戳推送事件,它将不会显示在结果集中。
1条答案
按热度按时间yfwxisqw1#
我将所有数据一批推送到流中。当时,还没有水印,所以我可以在结果集中看到旧事件。如果我将一些数据推送到流中,设置processingtime,例如100ms,100ms之后将推送旧数据,结果将是预期的。