06Flink Windows API——Flink

本文深入解析流处理中Window的概念及应用,包括CountWindow与TimeWindow两大类型,详细阐述滚动窗口、滑动窗口和会话窗口的特点及使用场景,并提供Flink实现窗口处理的实例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

window 是一种切割无限数据 为有限块进行处理的手段。 Window 是无限数据流处理的核心,Window 将一个无限的 stream 拆分成有限大 小的”buckets”桶,我们可以在这些桶上做计算操作

Windows可以分为两类

CountWindow:按照指定的数据条数生成一个 Window,与时间无关。

TimeWindow:按照时间生成 Window。

对于 TimeWindow,可以根据窗口实现原理的不同分成三类:

滚动窗口(Tumbling Window)、滑动窗口(Sliding Window)和会话窗口(Session Window)

滚动窗口:

特点:时间对齐,窗口长度固定,没有重叠。

一个月的销售额,一天的销售额。。。。

滑动窗口:

特点:时间对齐,窗口长度固定,可以有重叠。(有两个参数,一个是窗口大小,一个是滑动的步长)

会话窗口:

特点:时间无对齐。(按照时间间隔来划分)

session 窗口分配器通过 session 活动来对元素进行分组,session 窗口跟滚动窗 口和滑动窗口相比,不会有重叠和固定的开始时间和结束时间的情况,相反,当它 在一个固定的时间周期内不再收到元素,即非活动间隔产生,那个这个窗口就会关 闭。一个 session 窗口通过一个 session 间隔来配置,这个 session 间隔定义了非活跃 周期的长度,当这个非活跃周期产生,那么当前的 session 将关闭并且后续的元素将 被分配到新的 session 窗口中去。

 

如何用窗口呢,其实直接在流上.windows来开一个窗口

注意: .windows() 需要在keyby之后才可以用

1. 滚动窗口:将 Flink 获取到的 数据根据进入 Flink 的时间划分到不同的窗口中

val minTempPerWindow = dataStream
 .map(r => (r.id, r.temperature))
 .keyBy(_._1)
 .timeWindow(Time.seconds(15))
 .reduce((r1, r2) => (r1._1, r1._2.min(r2._2))) 
// 然后就用reduce来做聚合操作

 2. 滑动窗口:

滑动窗口和滚动窗口的函数名是完全一致的,只是在传参数时需要传入两个参 数,一个是 window_size,一个是 sliding_size。

val minTempPerWindow: DataStream[(String, Double)] = dataStream
 .map(r => (r.id, r.temperature))
 .keyBy(_._1)
 .timeWindow(Time.seconds(15), Time.seconds(5))
 .reduce((r1, r2) => (r1._1, r1._2.min(r2._2)))
.window(EventTimeSessionWindows.withGap(Time.minutes(10)) // 绘话窗口

 

CountWindow

注意:CountWindow 的 window_size 指的是相同 Key 的元素的个数,不是输入 的所有元素的总数。

1 滚动计数窗口:当元素数量 达到窗口大小时,就会触发窗口的执行

val minTempPerWindow: DataStream[(String, Double)] = dataStream
 .map(r => (r.id, r.temperature))
 .keyBy(_._1)
 .countWindow(5)
 .reduce((r1, r2) => (r1._1, r1._2.max(r2._2)))

2 滑动计数窗口:一个是 window_size,一个是 sliding_size。

val keyedStream: KeyedStream[(String, Int), Tuple] = dataStream.map(r =>
(r.id, r.temperature)).keyBy(0)
//每当某一个 key 的个数达到 2 的时候,触发计算,计算最近该 key 最近 10 个元素的内容
val windowedStream: WindowedStream[(String, Int), Tuple, GlobalWindow] =
keyedStream.countWindow(10,2)
val sumDstream: DataStream[(String, Int)] = windowedStream.sum(1)

进到窗口的数据拿到了之后,然后需要怎么操作呢,

就是需要到 window function 来定义要对窗口中收集的数据做的计算操作

1、增量聚合函数(incremental aggregation functions) 每条数据到来就进行计算,保持一个简单的状态。典型的增量聚合函数有 ReduceFunction, AggregateFunction。

2、全窗口函数(full window functions) 先把窗口所有数据收集起来,等到计算的时候会遍历所有数据。 ProcessWindowFunction 就是一个全窗口函数。

操作还是以DataStreaming  KeyStreaming为主

其它可选 API

 .trigger() —— 触发器 定义 window 什么时候关闭,触发计算并输出结果

 .evitor() —— 移除器 定义移除某些数据的逻辑 尚硅谷大数据技术之 Flink

 .allowedLateness() —— 允许处理迟到的数据

 .sideOutputLateData() —— 将迟到的数据放入侧输出流

 .getSideOutput() —— 获取侧输出流

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值