我有两个我想组合的数据流。问题在于,一个数据流的频率比另一个数据流更高,并且有时一个流根本没有接收事件。是否可以使用一个流中的最后一个事件,并在即将到来的每个事件上与另一个流一起加入?
我发现的唯一解决方案是使用JOIN功能,但是您必须指定一个通用窗口,可以在其中应用JOIN功能。当一个流未收到任何事件时,这是未达到的窗口。
是否有可能在来自一个流或另一个流的每个事件上应用JOIN功能并维护最后一个消耗事件的状态并将此事件用于JOIN功能?
根据每个特定用例的要求,有许多不同的方法可以在Flink中组合或连接两个流。当"手动"这样做时,您想与RichCoFlatMapFunction
或CoProcessFunction
一起使用Flink的ConnectedStream
s。其中任何一个都可以使您保持托管状态(即,来自不经常更新流的最后一个元素),并将其与更快的流一起加入。协调功能增加了与计时器一起工作的能力,如果这是相关的,则应使用该计时器清除过期密钥的状态。
Flink培训网站上有一个关于实施此类连接的方法的练习:富集加入。为一个简单的例子,另请参见有关到期状态的练习。
Flink的每个最新版本都包含了其他内置联接功能,因此在这一点上,滚动自己的滚动频率较低。有关更多详细信息,请参见与DataStream API一起加入的页面,加入表API,并加入SQL。