当前位置: 首页 > news >正文

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>>() {
http://www.zskr.cn/news/117347.html

相关文章:

  • 【计算机毕设】基于深度学习的人体摔倒识别方法与实现
  • Linux 内存管理:TLB ASID
  • 30-40 万新能源汽车 兼顾续航与智能的热门之选 - 速递信息
  • Skipping xxx as repository xxxx doesn‘t support architecture ‘i386‘
  • 网站建设公司怎么选?2025年网站设计制作公司推荐指南
  • 软硬协同:揭秘机器狗复杂地形适应背后的边缘智能中枢
  • 基于SpringBoot + Vue的高校科研项目申报审批管理系统
  • 基于SpringBoot + Vue的个性化学习系统
  • FlutterOpenHarmony底部导航栏组件开发
  • 深度分析:AI智能体记忆是如何管理的?
  • 2026年河北省职业院校技能大赛“信息技术应用创新”赛项(高职组)竞赛样题
  • 2025全球十大机床品牌排行榜:未来制造的中坚力量 - 速递信息
  • FlutterOpenHarmony动画效果实现指南
  • 零样本克隆音色有多强?实测EmotiVoice语音复刻能力
  • kanass全面介绍(15) - Kanass如何有效集成sward文档
  • 2025年沈阳优秀的无溶剂环氧涂料厂家需要多少钱,无溶剂环氧涂料/石墨烯涂料/环氧玻璃钢/环氧酚醛/光固化保护套无溶剂环氧涂料品牌选哪家 - 品牌推荐师
  • sward全面介绍(14) - 集成企业微信,使用企业微信扫码登录sward
  • 基于SSM + Vue的高校机房管理系统
  • LNMP架构学习
  • 关于 iphone抓包软件,我是在什么时候真正意识到选好工具很重要
  • EDA 缩写全解析系列|第 2 周:J–R
  • Spring Boot 自动配置的底层实现原理
  • Spring Cloud Stream RocketMQ整合步骤
  • 基于微信小程序公司企业小程序设计与实现作品
  • Threads登录不上怎么办?这样选独享IP更稳!
  • AIoT:从万物互联到万物智联的进化之路
  • Java-IO流
  • Spring Boot ——入门与实战
  • UniApp APP 端跳转三方页面后返回 APP 的实现原理与实操解析
  • 告别手动调试:Excel格式转换效率提升300%的秘诀