Apache Flink:在动态表上构建多对一连接的最佳方法?

时间:2018-02-02 22:29:50

标签: apache-flink flink-streaming stream-processing flink-sql

我有一个资源,经常添加/更新的行称为Orders,以及一个名为UserProfile的资源,其频率较低(但通常很重要)。我想对这两个资源执行连续连接查询(当前逻辑上存储为Flink中的动态表),这样当发生UserProfile更新时,连接表会发出一个DataStream,其中每个订单更新一个EnrichedOrder与该UserProfile相关联< / strong>即可。目标是索引这个丰富的非规范化数据,以便在下游数据接收器中进行有效查询。

我的问题是,构建此联接的最佳方法是什么?具体来说,我如何确保所有订单记录在&#34;很多&#34;当更新UserProfile时,加入的一边是丰富的,同时仍保持高性能?

由于在Flink中无法进行任何没有时间窗口的内部连接(可能是出于性能原因),我想也不鼓励设置一个过大的时间窗口。

此用例的推荐方法是什么?

1 个答案:

答案 0 :(得分:2)

在Flink 1.4.0中,SQL不支持没有时间边界的流上的内部连接,并且DataStream API不提供良好的语法。但是,可以hand-craft such a join使用CoProcessFunction

Flink 1.5.0将支持SQL中的无界流连接。默认情况下,两个输入表都将完全保持状态。但是,可以配置状态保留时间,之后清除非活动密钥的状态(非活动=在配置的间隔内未更新)。

由于SQL支持是在DataStream API之上实现的,因此您可以查看implementation of the unbounded SQL join