Apache flink Flink CEP应用

Apache flink Flink CEP应用,apache-flink,complex-event-processing,Apache Flink,Complex Event Processing,我试图在Flink中实现以下场景 我有许多类型为“A”的事件和许多类型为“B”的事件,它们是类型为“事件”的子类型。两者都有(除其他外)一个可以用作公共密钥的字段(例如,a.id=“5”,B.id=“5”表示a指B)。我希望在同一数据流中接收具有相同密钥的多个As和Bs(即,我可能会接收id为“5”的5个As和id为“5”的3个Bs)。我想做的是单独打印所有内容,但在特定时间窗口内(例如每天)打印A的第一次出现(或B到达后A的第一次出现)及其链接的B元素。例如,我收到以下数据流(假设这是一整天的

我试图在Flink中实现以下场景

我有许多类型为“A”的事件和许多类型为“B”的事件,它们是类型为“事件”的子类型。两者都有(除其他外)一个可以用作公共密钥的字段(例如,a.id=“5”,B.id=“5”表示a指B)。我希望在同一数据流中接收具有相同密钥的多个As和Bs(即,我可能会接收id为“5”的5个As和id为“5”的3个Bs)。我想做的是单独打印所有内容,但在特定时间窗口内(例如每天)打印A的第一次出现(或B到达后A的第一次出现)及其链接的B元素。例如,我收到以下数据流(假设这是一整天的数据流)

[b{id=“5”,name=“Test B5_1”},a{id=“5”,name=“Test A5_1”},b{id=“5”,name=“Test B5_2”},a{id=“5”,name=“Test A5_2”},b{id=“5”,name=“Test B5_1”},b{id=“5”,name=“Test B5_2”},a{id=“5”,name=“Test A5_3”]

我想打印的第一张是

A TEST5_1 -> Test B5_1
A TEST5_2 -> null
A TEST5_3 -> null
我想做的是将我的流分割成As和Bs,然后提取Tuple2中的键,其中Tuple中的第二个位置是公共键。然后,合并这两个数据流,并对f1(元组中的键)执行KeyBy操作,以确保它们最终位于同一个插槽中(我想通过实现自定义KeySelector,我可以在不拆分流的情况下使用相同的KeyBy)。这样做之后,我可以使用一个映射来实现我的逻辑,如果我今天发送了一个带有链接B的a,我将在其中进行存储。如果没有,我会发送它的链接,更新地图,否则我只会发送它自己

我还认为可以使用一个连接操作符来实现这一点,在这个操作符中,我使用As和Bs的公共密钥将它们配对在一起,但是我相信这样我将只发送与第一个B匹配的第一个a,而忽略其余的,这不是我需要的

我想知道的是,如果我需要的模式可以使用Flink CEP API和一些指导来定义