news 2026/4/23 15:23:27

Flink Join 核心解析:类型、原理、实操

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Flink Join 核心解析:类型、原理、实操

        Flink 中的 Join 是用于关联两个或多个数据流 / 数据集的核心操作,分为批处理(Batch)Join流处理(Stream)Join两大类。批处理 Join 基于静态数据集,逻辑与传统数据库 Join 类似;而流处理 Join 基于无限数据流,需结合窗口状态实现,是 Flink 流处理的重点和难点。以下是详细解析。

一、Flink Join 的核心分类

        Flink Join 主要分为两大维度:

维度类型适用场景核心原理
数据形态批处理 Join(DataSet API)静态数据集关联(如历史数据)基于内存 / 磁盘的哈希 Join、排序合并 Join
数据形态流处理 Join(DataStream API)实时数据流关联(如实时订单 + 用户)基于窗口 / 状态存储,在窗口内关联数据
Join 逻辑Inner Join(内连接)只保留两边都匹配的数据仅输出匹配的记录
Join 逻辑Left Outer Join(左外连接)保留左表所有数据,右表匹配的数据左表无匹配时,右表字段为 null
Join 逻辑Right Outer Join(右外连接)保留右表所有数据,左表匹配的数据右表无匹配时,左表字段为 null
Join 逻辑Full Outer Join(全外连接)保留两边所有数据无匹配时对应字段为 null

注意:Flink 1.12+ 主推 Table API/SQL 实现 Join,其语法更简洁、功能更完善(支持更多 Join 类型),而 DataStream API 需手动实现窗口 / 状态管理。

二、批处理 Join(DataSet API)

        批处理 Join 针对静态数据集,语法和逻辑与传统数据库 Join 一致,Flink 会根据数据量自动选择哈希 Join排序合并 Join优化性能。

1. 核心原理

  • 哈希 Join:将小数据集加载到内存中构建哈希表,遍历大数据集进行匹配(适用于小表 + 大表);
  • 排序合并 Join:将两个数据集排序后,遍历并合并匹配的数据(适用于大表 + 大表)。

2. 代码实操(Java)

import org.apache.flink.api.common.functions.JoinFunction; import org.apache.flink.api.java.ExecutionEnvironment; import org.apache.flink.api.java.DataSet; import org.apache.flink.api.java.tuple.Tuple2; import org.apache.flink.api.java.tuple.Tuple3; public class BatchJoinExample { public static void main(String[] args) throws Exception { // 1. 创建批处理执行环境 ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment(); // 2. 定义左表:用户数据(用户ID,用户名) DataSet<Tuple2<Integer, String>> userDataSet = env.fromElements( Tuple2.of(1, "Alice"), Tuple2.of(2, "Bob"), Tuple2.of(3, "Charlie") ); // 3. 定义右表:订单数据(订单ID,用户ID,金额) DataSet<Tuple3<Integer, Integer, Double>> orderDataSet = env.fromElements( Tuple3.of(101, 1, 99.9), Tuple3.of(102, 2, 199.9), Tuple3.of(103, 4, 299.9) // 用户ID=4,左表无匹配 ); // 4. Inner Join:按用户ID关联,保留两边匹配的数据 DataSet<Tuple3<Integer, String, Double>> innerJoinResult = userDataSet .join(orderDataSet) .where(0) // 左表的关联字段:用户ID(Tuple2的第0位) .equalTo(1) // 右表的关联字段:用户ID(Tuple3的第1位) .with(new JoinFunction<Tuple2<Integer, String>, Tuple3<Integer, Integer, Double>, Tuple3<Integer, String, Double>>() {
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 13:01:46

31、Linux 应用更新与系统安全保障

Linux 应用更新与系统安全保障 一、Linux 应用在线更新 在 Linux 系统中,不同的发行版都提供了在线更新软件的实用工具。不过,在进行在线更新之前,需要确保有快速的互联网连接,如 DSL 或有线电视调制解调器,并且网络连接正常。 (一)使用 rpmbuild 构建软件 可以使用…

作者头像 李华
网站建设 2026/4/22 21:31:55

springboot+jspm宠物医院药房管理系统的研究与实现_47e81477

目录 已开发项目效果实现截图开发技术介绍系统开发工具&#xff1a; 核心代码参考示例1.建立用户稀疏矩阵&#xff0c;用于用户相似度计算【相似度矩阵】2.计算目标用户与其他用户的相似度系统测试总结源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式…

作者头像 李华
网站建设 2026/4/23 3:21:31

【EI收录】第三届智能交通及智慧城市国际会议(ICITSC 2026)

第三届智能交通及智慧城市国际会议&#xff08;ICITSC 2026&#xff09;将于2026年4月10至12日在洛阳召开。本届大会以“智能交通及智慧城市”为主题&#xff0c;将汇聚来自学术界和产业界的专家、研究人员和从业人员&#xff0c;通过学术交流和技术论文发表&#xff0c;展示最…

作者头像 李华