news 2026/4/16 17:23:52

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/16 10:14:13

45、Linux技术全面指南:符号、网络、应用与安全解析

Linux技术全面指南:符号、网络、应用与安全解析 1. 符号与数字表示 在Linux系统里,有不少特殊的符号和数字表示方法,它们在不同场景下发挥着关键作用。例如,“.”代表当前目录,“..”表示父目录,“/”是根目录,同时在文件系统组织中也有重要意义。“[ ]”作为通配符占…

作者头像 李华
网站建设 2026/4/16 10:26:30

数据为核,驱动智造:产品数据管理(PDM)的核心价值与选型指南

在智能制造与数字化转型的浪潮中&#xff0c;产品研发数据已成为企业的核心战略资产。如何有效管理海量、复杂且关联紧密的产品数据&#xff0c;确保其准确性、一致性与可追溯性&#xff0c;是制造企业提升效率、缩短上市时间的关键。产品数据管理&#xff08;Product Data Man…

作者头像 李华
网站建设 2026/4/16 10:27:54

Linux线程:轻量高效但需谨慎

Linux线程概述Linux线程是轻量级进程&#xff08;LWP&#xff09;&#xff0c;属于某个进程并共享其资源&#xff08;如内存&#xff09;&#xff0c;但各自拥有独立的栈区。相比进程&#xff0c;线程的优势在于创建开销小&#xff08;仅需分配8MB栈区&#xff0c;而进程需3GB空…

作者头像 李华
网站建设 2026/4/16 10:27:02

电机控制器中IGBT结温估算的‘算法+模型‘机密级解决方案

电机控制器&#xff0c;IGBT结温估算&#xff08;算法模型&#xff09;国际大厂机密算法&#xff0c;多年实际应用&#xff0c;准确度良好 高价值知识 能够同时对IGBT内部6个三极管和6个二极管温度进行估计&#xff0c;并输出其中最热的管子对应温度。 可用于温度保护&#xff…

作者头像 李华
网站建设 2026/4/16 10:26:47

光伏MPPT虚拟同步发电机并网仿真模型:扰动观察法最大功率跟踪与直流母线电容电压控制策略的研究与实践

光伏MPPT虚拟同步发电机(VSG)并网仿真模型 结构&#xff1a;前级光伏板采用扰动观察法最大功率跟踪给定值&#xff0c;然后将该功率通过直流母线电容电压进行功率解耦并经过逆变器输送给右侧的负载和电网 控制&#xff1a;光伏Boost采用经典的扰动观察法&#xff0c;逆变器采用…

作者头像 李华