登 录
注 册
< 大 数 据
Flink
Hadoop
Spark
Hive
HBase
Kafka
其他框架
Flink本地程序开发
Flink实战-数据准备
Flink实战-自定义Sink
Flink实战-实时计算
Flink实战-部署上线
文件映射为Table
FlinkTable自定义函数
Flink API JOIN总结
Flink SQL JOIN总结
3分钟搭建Flink SQL测试环境
热门推荐>>>
中台架构
中台建设与架构
Hadoop
源码分析-NN启动(三)
HBase
HBased对接Hive
Linux
Nginx高可用
Python
数据导出工具
Kafka
Kafka对接Flume
深度学习
卷积神经网络
数据结构与算法
选择合适的算法
MySQL
数据备份恢复
计算机系统
信号量同步线程
Hive
Hive调优参数大全
其他框架
Azkaban Flow1.0与2.0
ClickHouse
表引擎-其他类型
技术成长
最好的职业建议
精选书单
技术成长书单—机器学习
技术资讯
数据在线:计算将成为公共服务
开发工具
IntelliJ IDEA 20年发展回顾(二)
系统工具
Mac命令行工具
虚拟化
内存虚拟化概述
云原生
云原生构建现代化应用
云服务
一文搞懂公有云、私有云...
Java
Spring Boot依赖注入与Runners
Go
Go函数与方法
SQL
SQL模板
安全常识
一文读懂SSO
当前位置:
首页
>>
Flink
>>
Flink API JOIN总结
Flink API JOIN总结
2024-01-06 11:24:25 星期六 发表于北京 阅读:785
![](/static/images/article_images/1704509313.190937.jpeg) Flink双流JOIN其实可以理解为统计一定时间(在业务可接受的匹配时间范围)内两条流的匹配情况 #### 一、Window JOIN Flink基于一段时间的双流合并提供了一个窗口连接算子,可以定义时间窗口,并将两条流中共享同一个公共键的数据放在同一个窗口中进行匹配 Flink window join可分为: >滚动window join 滑动window join 会话window join 原理大同小异,以下以滚动window jion为例展开说明 ##### 示意图 ![](/static/images/article_images/1704510701.1030993.jpeg) ##### demo ```scala stream1.join(stream2) .where(<KeySelector>) .equalTo(<KeySelector>) .window(<WindowAssigner>) .apply(<JoinFunction>) // JoinFunction就是JOIN上之后需要处理的操作,可以根据业务场景进行个性化处理(重写原函数) @Override public String join(Object left, Object right){ return left + "---" + right; } ``` | 优点 | 缺点 | | ------------ | ------------ | | 处理逻辑简单 |落在同一个时间窗口范围内才能匹配,只能拿到匹配上的数据,类似inner join | Flink并**不建议使用这种方式关联**,因为按照窗口来固定关联边界,只要有一条流稍微有延迟,可能就匹配不上了,容错性很低。而且也无法拿到匹配不上的数据 #### 二、Interval JOIN 在大多数场景中,我们要处理的时间间隔可能并不是固定的,这时显然不应该用滚动窗口来处理,Flink提供了一种叫做间隔连接的合流操作——针对一条流的每条数据,开辟出其时间戳前后的一段时间间隔(**上界和下界**),看该间隔是否有来自另一条流的数据匹配 ##### 示意图 ![](/static/images/article_images/1704512070.5435045.jpeg) 注:Interval join 目前仅支持 event time ##### demo ```java orangeStream .keyBy(<KeySelector>) .intervalJoin(greenStream.keyBy(<KeySelector>)) .between(Time.milliseconds(-2), Time.milliseconds(1)) .process (new ProcessJoinFunction<Integer, Integer, String>(){ @Override public void processElement(Integer left, Integer right, Context ctx, Collector<String> out) { out.collect(left + "," + right); } }); ``` | 优点 | 缺点 | | ------------ | ------------ | | 双流JOIN关联率大大提高</br> 可单独处理迟到数据(关联不上的数据)| 任务占用资源较多 |