news 2026/1/11 7:53:29

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/1/5 22:57:52

Xiaomi 商城页面布局(部分)

HTML部分&#xff1a;<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><li…

作者头像 李华
网站建设 2026/1/2 20:24:34

运料小车装卸料控制:西门子1200PLC与TP700触摸屏联机仿真博途16

运料小车装卸料控制西门子1200PLC和TP700触摸屏联机仿真博途16最近在车间折腾运料小车的自动化改造&#xff0c;用西门子1200PLC搭了个装卸料控制系统。正好手头有TP700触摸屏&#xff0c;索性在博途V16里搞了个联合仿真&#xff0c;省得去现场调试吃灰。这个方案特别适合产线还…

作者头像 李华
网站建设 2026/1/5 17:40:30

S32K311启动过程中,向量表重定向

在MCU的启动过程中&#xff0c;NXP官方提供的启动代码会对中断向量表进行重定向&#xff0c;将向量表从flash定向到ram。具体实现分析如下。Vector_Table.sSECTION .intvec:DATA:ROOT(2&#xff09;通过这个命令&#xff0c;声明一个.intvec的段&#xff0c;这条指令下面申明的…

作者头像 李华
网站建设 2026/1/7 4:55:02

从蓝图到产线:高效产品信息传递的桥梁建设

在制造业中&#xff0c;研发设计的精妙构思与生产部门的高效执行之间&#xff0c;存在着一条至关重要的信息传递链。这条链路的畅通与否&#xff0c;直接决定了产品能否从图纸精准、准时地转化为合格的商品。本文将深入探讨这一过程的标准实践、常用工具、潜在挑战及其优化方案…

作者头像 李华
网站建设 2026/1/6 21:30:35

时间复杂度

这种题目是数据结构与算法考研&#xff08;如408&#xff09;或面试中的高频送分题&#xff0c;但也是高频陷阱题。 复习这类题目&#xff0c;不要靠“猜”或者“死记硬背”&#xff0c;而是要掌握一套**“数学建模”**的方法。一旦你建立了数学直觉&#xff0c;这类题看一眼就…

作者头像 李华