44、Flink 的 Interval Join 详解

Interval Join

Interval join 组合元素的条件为 :两个流(暂时称为 A 和 B)中 key 相同且 B 中元素的 timestamp 处于 A 中元素 timestamp 的一定范围内,即 b.timestamp ∈ [a.timestamp + lowerBound; a.timestamp + upperBound]a.timestamp + lowerBound <= b.timestamp <= a.timestamp + upperBound

这里的 a 和 b 为 A 和 B 中共享相同 key 的元素,上界和下界可正可负,只要下界永远小于等于上界即可,Interval join 目前仅执行 inner join

当一对元素被传递给 ProcessJoinFunction,他们的 timestamp 会从两个元素的 timestamp 中取最大值 (timestamp 可以通过 ProcessJoinFunction.Context 访问)。

Interval join 目前仅支持 event time。

上例中,join 了橙色和绿色两个流,join 的条件是:以 -2 毫秒为下界、+1 毫秒为上界。

默认情况下,上下界也被包括在区间内,但 .lowerBoundExclusive().upperBoundExclusive() 可以将它们排除在外。

图中三角形所表示的条件也可以写成更加正式的表达式:

复制代码
orangeElem.ts + lowerBound <= greenElem.ts <= orangeElem.ts + upperBound

代码示例

复制代码
import org.apache.flink.api.java.functions.KeySelector;
import org.apache.flink.streaming.api.functions.co.ProcessJoinFunction;
import org.apache.flink.streaming.api.windowing.time.Time;

...

DataStream<Integer> orangeStream = ...;
DataStream<Integer> greenStream = ...;

orangeStream
    .keyBy(<KeySelector>)
    .intervalJoin(greenStream.keyBy(<KeySelector>))
    .between(Time.milliseconds(-2), Time.milliseconds(1))
    .process (new ProcessJoinFunction<Integer, Integer, String>(){

        @Override
        public void processElement(Integer left, Integer right, Context ctx, Collector<String> out) {
            out.collect(left + "," + right);
        }
    });
相关推荐
TDengine (老段)33 分钟前
以事件为核心 + 以资产为核心:工业数据中缺失的关键一环
大数据·数据库·人工智能·时序数据库·tdengine·涛思数据
阿里云大数据AI技术39 分钟前
欣和大数据阿里云上升级,打造湖仓一体平台
大数据·人工智能
极创信息2 小时前
信创软件安全加固指南,信创软件的纵深防御体系
java·大数据·数据库·金融·php·mvc·软件工程
尽兴-2 小时前
Elasticsearch 性能调优指南:写入、检索、聚合与缓存全链路优化
大数据·elasticsearch·缓存·性能优化·es 读写原理
AI营销先锋2 小时前
原圈科技AI市场分析:破解增长瓶颈,领航智能营销
大数据·人工智能
算法-大模型备案 多米2 小时前
大模型备案实操指南:材料、流程与避坑要点
大数据·网络·人工智能·算法·文心一言
AI职业加油站3 小时前
数据要素时代:大数据治理工程师证书深度解码
大数据·开发语言·人工智能·python·数据分析
运维行者_3 小时前
通过 OpManager 集成 Firewall Analyzer 插件,释放统一网络管理与安全的强大能力
大数据·运维·服务器·网络·数据库·安全
千匠网络4 小时前
2026 AI 应用峰会启幕,共拓企业智能增长新未来
大数据·人工智能