我很困惑TUMBLE窗口是否会按规则间隔计算并发出元素进行处理。例如,我有一个查询,它的工作间隔为10秒。
select id, key from eventTable GROUP BY TUMBLE(rowTime, INTERVAL '10' SECOND), id, key ;
现在让我们说:应用程序接收事件
- E1@10:00:00
- E2@10:00:05
- E3@12:00:10
如您所见,E1和E2在5秒内达到,E3在12:00:15达到。
- 当E1&E2将被发射以进行处理?会是10:00:11吗?或者E3何时到来,然后查询将评估窗口并发出
- 如果是在E3之后,那么有什么方法可以确保每10秒执行一次查询吗
感谢您在这方面的帮助。
如果使用事件时间处理,则当水印经过10:00:10时,将发出在10:00:10结束的窗口。如果水印是以通常的有界无序方式进行的,并且如果没有其他事件,则水印在E3处理之前不会前进。
如果您需要考虑空闲的水印策略,我相信您唯一的选择是使用DataStream API创建流并应用处理空闲源的水印,然后将DataStream转换为表。
请注意,.withIdleness(...)
所做的是将流标记为空闲,这样可以防止该流保留水印。这解决了如果存在其他活动流,则一个空闲流会阻碍整个作业的问题。如果你想让水印在完全没有发生任何事情的情况下进行,你需要做一些更激烈的事情。
理想的解决方案是拥有来自同一来源的保持活动消息,这样您就知道空闲是真实的,而不是停机。如果无法做到这一点,请参阅ProcessingTimeTrailingBoundedOutOfOrdernessTimestampExtractor,以了解如何使用计时器检测空闲状态并根据时间的流逝而不是新事件的到达来提前水印的示例。(请注意,此示例尚未更新为使用新的WatermarkStrategy
接口。(
您可以配置tableEnv让表提前发射:
TableConfig config = bbTableEnv.getConfig();
config.getConfiguration().setBoolean("table.exec.emit.early-fire.enabled", true);
config.getConfiguration().setString("table.exec.emit.early-fire.delay", "1s");