Apache Flink:在动态 table 上构建多对一连接的最佳方式?
Apache Flink: Best way to architect many-to-one join on dynamic table?
我有一个名为 Orders 的资源经常包含 added/updated 行,还有一个名为 UserProfile 的资源更新频率较低(但通常很重要)。我想对这两个资源执行连续连接查询(目前在 Flink 中逻辑上存储为动态 tables),这样当发生 UserProfile 更新时,连接 table 发出一个数据流 每个与该 UserProfile 关联的订单更新 EnrichedOrder。 objective 是为这个丰富的非规范化数据建立索引,以便在下游数据接收器中进行高效查询。
我的问题是,构建此连接的最佳方式是什么?具体来说,我如何确保在更新 UserProfile 时丰富联接 "many" 侧的 all 订单记录,同时仍然保持性能?
由于在 Flink 中不可能进行没有时间 window 的任意内部连接(大概是出于性能原因),我想设置过大的时间 window 也是不鼓励的。
此用例的推荐方法是什么?
在 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.
我有一个名为 Orders 的资源经常包含 added/updated 行,还有一个名为 UserProfile 的资源更新频率较低(但通常很重要)。我想对这两个资源执行连续连接查询(目前在 Flink 中逻辑上存储为动态 tables),这样当发生 UserProfile 更新时,连接 table 发出一个数据流 每个与该 UserProfile 关联的订单更新 EnrichedOrder。 objective 是为这个丰富的非规范化数据建立索引,以便在下游数据接收器中进行高效查询。
我的问题是,构建此连接的最佳方式是什么?具体来说,我如何确保在更新 UserProfile 时丰富联接 "many" 侧的 all 订单记录,同时仍然保持性能?
由于在 Flink 中不可能进行没有时间 window 的任意内部连接(大概是出于性能原因),我想设置过大的时间 window 也是不鼓励的。
此用例的推荐方法是什么?
在 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.