news 2026/6/8 8:34:15

Flink学习笔记:多流 Join

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Flink学习笔记:多流 Join

前面我们已经了解了 Flink 几个核心概念,分别是时间、Watermark 已经窗口。今天我们来一起了解下 Flink 是怎么进行多个流的 Join 的。

我们今天从两个流的 Join 来入手,扩展到多个流也是一样的道理。Flink 中的 Join 可以分为两种:Window Join 和 Interval Join。

Window Join

Window Join 是将两个流中在相同窗口中且有相同 key 的元素进行关联。关联后,可以使用 JoinFunction 和 FlatJoinFunction 进行处理。Window Join 可以根据窗口类型分为三种:Tumbling Window Join、Sliding Window Join 和 Session Window Join。

Tumbling Window Join

首先来看Tumbling Window Join,其实就是对应的使用滚动窗口进行 Join。

TumblingWindowJoin

具体使用方法如下:

DataStream<Tuple2<String, Double>> result = source1.join(source2)

.where(record -> record.f0)

.equalTo(record -> record.f0)

.window(TumblingEventTimeWindows.of(Time.seconds(2L)))

.apply(new JoinFunction<Tuple2<String, Double>, Tuple2<String, Double>, Tuple2<String, Double>>() {

@Override

public Tuple2<String, Double> join(Tuple2<String, Double> record1, Tuple2<String, Double> record2) throws Exception {

return Tuple2.of(record1.f0, record1.f1);

}

});

其中 source1 和 source2 分别代表两个流,where 为 source1 的 join key 提取方法,equalTo 为 source2 的 join key 提取方法,最后,join 好之后的数据通过 JoinFunction 来处理。

Sliding Window Join

Sliding Window Join 和 Tumbling Window Join 的用法基本一致,只是将窗口指定为滑动窗口。

SlidingWindowJoin

Session Window Join

Session Window Join 也类似,只是指定的窗口不同,具体的处理流程都是一样的,这里也不过多解释。

Interval Join

Interval Join 是将两个流中 key 相同,且一个流的 timestamp 处于另一个流的 timestamp 上下波动范围内。

假设我们有两个流 a 和 b,Interval Join可以表达为b.timestamp ∈ [a.timestamp + lowerBound; a.timestamp + upperBound] 或 a.timestamp + lowerBound <= b.timestamp <= a.timestamp + upperBound。

需要注意的是,目前 Interval Join 仅支持 event time。

IntervalJoin

它的使用方法也很简单,只需要定义上下偏移量以及处理函数即可。

DataStream<Tuple2<String, Double>> intervalJoinResult = source1.keyBy(record -> record.f0)

.intervalJoin(source2.keyBy(record -> record.f0))

.between(Time.seconds(-2), Time.seconds(2))

.process(new ProcessJoinFunction<Tuple2<String, Double>, Tuple2<String, Double>, Tuple2<String, Double>>() {

@Override

public void processElement(Tuple2<String, Double> record1, Tuple2<String, Double> record2, ProcessJoinFunction<Tuple2<String, Double>, Tuple2<String, Double>, Tuple2<String, Double>>.Context context, Collector<Tuple2<String, Double>> out) throws Exception {

out.collect(Tuple2.of(record1.f0, record1.f1 + record2.f1));

}

});

CoGroup

前面介绍的两种 Join 都是 inner join,那么 Flink 有没有办法支持 left join 呢?答案是肯定的,我们可以使用 coGroup 来实现。

coGroup 的通用用法如下:

stream.coGroup(otherStream)

.where(<KeySelector>)

.equalTo(<KeySelector>)

.window(<WindowAssigner>)

.apply(<CoGroupFunction>);

我们通过自定义 CoGroupFunction 来实现 left join。

private static class LeftJoinFunction implements CoGroupFunction<Tuple2<String, Double>, Tuple2<String, Double>, Tuple2<String, Double>> {

@Override

public void coGroup(Iterable<Tuple2<String, Double>> iterable1, Iterable<Tuple2<String, Double>> iterable2, Collector<Tuple2<String, Double>> collector) throws Exception {

for (Tuple2<String, Double> record1 : iterable1) {

boolean match = false;

for (Tuple2<String, Double> record2 : iterable2) {

match = true;

collector.collect(Tuple2.of(record1.f0, record1.f1 + record2.f1));

}

if (!match) {

System.out.println("没有join的元素 key:" + record1.f0);

collector.collect(Tuple2.of(record1.f0, record1.f1));

}

}

}

}

在 coGroupFunction 中,需要实现 coGroup 方法,方法的参数包括两个输入流的 Iterable 和输出的 collector。如果第二个流中没有匹配的元素,那么就直接输出第一个流的元素。

总结

最后来总结一下,Flink 中有两种 Join 方法,分别为 Window Join 和 Interval Join,Window Join 是依赖窗口来执行,对窗口内的元素进行 join,Interval Join 不依赖窗口,是根据 event time 的范围来进行 join。最后还介绍了 CoGroup,我们可以使用 CoGroup 来实现 left join 和 right join。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/5 21:16:13

Java反射机制:原理、应用与最佳实践

在Java开发中&#xff0c;反射机制是一项核心且强大的技术&#xff0c;它允许程序在运行时获取类的信息、操作对象的属性和方法&#xff0c;甚至动态创建对象。本文将从原理、应用场景到最佳实践&#xff0c;全面解析Java反射机制&#xff0c;帮助开发者灵活运用这一技术。一、…

作者头像 李华
网站建设 2026/6/4 3:02:48

ReAct+LangGraph:构建大模型智能体的完整指南(含代码示例)

简介 本文详细介绍了如何使用LangGraph框架构建ReAct智能体&#xff0c;分为硬编码和基于大语言模型两种实现方式。ReAct框架通过"推理行动"的循环流程&#xff0c;使智能体能思考并解决问题。LangGraph允许将智能体行为定义为"图"结构&#xff0c;支持复杂…

作者头像 李华
网站建设 2026/6/7 6:45:04

从千问灵光 App 看生成式 UI 技术的发展

本文由体验技术团队OpenTiny项目负责人莫春辉老师原创。 引言 2025 年 11 月 18 日&#xff0c;蚂蚁集团全模态通用 AI 助手——灵光 App 发布&#xff0c;上线两周用户已创建 330 万个闪应用。这一现象级数据的背后&#xff0c;不仅是开发效率的提升&#xff0c;更是人机交互…

作者头像 李华
网站建设 2026/6/8 4:48:35

普通程序员必看:该不该转型AI大模型?收藏这篇少走弯路

前言&#xff1a;AI浪潮下&#xff0c;程序员的转型焦虑与机遇 在程序员的日常交流中&#xff0c;"技术迭代"和"职业转型"永远是绕不开的话题。尤其是2023年以来&#xff0c;GPT-4、文心一言等大模型相继爆发&#xff0c;AI技术从实验室走向产业落地&#…

作者头像 李华
网站建设 2026/6/7 5:24:02

医疗挂号管理系统毕业论文+PPT(附源代码+演示视频)

文章目录医疗挂号管理系统一、项目简介&#xff08;源代码在文末&#xff09;1.运行视频2.&#x1f680; 项目技术栈3.✅ 环境要求说明4.包含的文件列表&#xff08;含论文&#xff09;数据库结构与测试用例系统功能结构后台运行截图项目部署源码下载医疗挂号管理系统 如需其他…

作者头像 李华
网站建设 2026/6/4 0:34:17

实用指南:文献怎么查——高效查找文献的方法与技巧

① WisPaper&#xff08;文献聚类 术语辅助&#xff09; 官网&#xff1a;https://www.wispaper.ai 帮助快速理解陌生领域的核心概念和研究主题。 ② Elicit 自动列出最相关论文和方法&#xff0c;为跨学科快速扫文献提供便利。 ③ Explainpaper 逐段解释论文内容&#xff0c…

作者头像 李华