我试图在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\u 1”},a{id=“5”,name=“test a5\u 1”},b{id=“5”,name=“test b5\u 2”},a{id=“5”,name=“test a5\u 2”},b{id=“5”,name=“test b5\u 1”},b{id=“5”,name=“test b5\u 2”},a{id=“5”,name=“test a5\u 3”}]
我想打印的第一张是
A TEST5_1 -> Test B5_1
A TEST5_2 -> null
A TEST5_3 -> null
我想做的是将流拆分为as和bs,然后提取tuple2<event,string>中的键,其中tuple中的第二个位置是公共键。然后,合并这两个数据流并对f1(元组中的键)执行keyby操作,以确保它们最终位于同一个槽中(我想我可以通过实现一个自定义keyselector,在不拆分流的情况下返回相同的槽)。之后,我可以实现我的逻辑使用一个Map,我将在其中存储,如果我已经发送了一个与其链接的b这一天。如果没有,我会发送它的链接,更新Map,否则我只发送它自己。
我还认为可以使用一个连接操作符来实现,在这个操作符中,我使用as和bs的公共密钥将它们配对在一起,但是我相信这样我只会发送与第一个b匹配的第一个a,而忽略其余的,这不是我需要的。
我想知道的是,如果我需要的模式,可以使用flinkcepapi和一些指导来定义。
暂无答案!
目前还没有任何答案,快来回答吧!