Flink中基于时间的合流--双流联结(join)

Flink提供了两种基于时间的合流操作,分别是窗口联结(Window Join)和间隔联结(Interval Join)。

一、窗口联结(Window Join)

Flink为基于一段时间的双流合并提供了一个窗口联结算子。在定义的时间窗口中,通过两条流中共享的公共键(key)来进行两条流中的数据的匹配。

窗口联结在代码中的实现,首先需要调用DataStream的.join()方法来合并两条流,得到一个JoinedStreams;接着通过.where()和.equalTo()方法指定两条流中联结的key;然后通过.window()开窗口,并通过.apply()传入联结窗口函数进行处理计算。其调用形式如下所示:

上述代码中.where()的参数是键选择器(KeySelector),用来指定第一条流中的key;而.equalTo()传入的KeySelector则指定了第二条流中的key。两者相同的元素,如果在同一个窗口内,就可以进行匹配,如果不在同一个窗口内,即便是key相同也不会进行数据匹配。这里的.window()传入的就是窗口分配器,就是前几节讲的滚动窗口、滑动窗口、会话窗口。.apply()就是对两个流中匹配的数据进行处理的操作。

二、间隔联结(Interval Join)

在有些场景下,利用窗口联结会有些问题,就是我们要处理的时间间隔可能并不是固定的,这时就不应该应用滚动窗口或者滑动窗口来处理了。

间隔联结的原理就是针对一条流中的每一条数据,开辟出其时间戳前后的一段时间间隔,看这期间是否有来自另外一条流中的数据匹配。

间隔联结的具体定义方式是,我们给定两个时间点,分别叫做间隔的"上界"(upperBound)和"下界"(lowerBound);于是对于一条流中的任意一个数据元素a,就可以开辟这条数据的时间间隔[a.timestamp + lowerBound,a.timestamp + upperBound],然后根据这个时间间隔去另外一条流中找在这个时间间隔内并且有相同key的数据。其大致详情如下图:

对于迟于这个时间间隔的数据才到来的数据,由于其水位线可能已经高于这个时间间隔,那么它就不会再被纳入处理,这种数据就会被丢弃。如果想把丢弃的数据展示出来,可以采用侧输出的方式将数据输出到侧输出流中。

相关推荐
2501_941882481 天前
AI系统工程化架构与大模型部署实践分享
flink
新诺韦尔API1 天前
手机三要素验证不通过的原因?
大数据·智能手机·api
成长之路5141 天前
【数据集】分地市全社会用电量统计数据(2004-2022年)
大数据
InfiSight智睿视界1 天前
门店智能体技术如何破解美容美发连锁的“标准执行困境”
大数据·运维·人工智能
Python_Study20251 天前
制造业数据采集系统选型指南:从技术挑战到架构实践
大数据·网络·数据结构·人工智能·架构
Cx330❀1 天前
Git 多人协作全攻略:从入门到高效协同
大数据·elasticsearch·搜索引擎·gitee·github·全文检索·gitcode
Tob管理笔记1 天前
建筑业如何精准开拓优质客户?技术驱动下的方法论与实践
大数据·云计算·数据库开发
MM_MS1 天前
Halcon控制语句
java·大数据·前端·数据库·人工智能·算法·视觉检测
JZC_xiaozhong1 天前
主数据同步失效引发的业务风险与集成架构治理
大数据·架构·数据一致性·mdm·主数据管理·数据孤岛解决方案·数据集成与应用集成
T06205141 天前
【数据集】全国各地区教育139个相关指标数据集(2000-2024年)
大数据