🪟 1. 基于时间驱动的滚动时间窗口(Tumbling Time Window - Time-based)
✅ 定义:
- 每隔固定的时间周期开启一个新的窗口。
- 窗口之间不重叠。
🕒 示例:
DataStream<Tuple2<String, Integer>> windowedStream = stream
.keyBy(keySelector)
.window(TumblingEventTimeWindows.of(Time.seconds(5)))
.sum(1);
🔍 特点:
属性 |
描述 |
类型 |
Keyed 或 Non-Keyed |
时间戳 |
依赖事件时间或处理时间 |
触发机制 |
固定时间触发 |
应用场景 |
统计每 N 秒的数据总量(如每分钟订单数) |
🧊 2. 基于事件驱动的滚动时间窗口(Tumbling Count Window - Event-based)
✅ 定义:
- 每收集固定数量的元素后触发一次窗口计算。
- 不依赖时间,只依赖元素个数。
📏 示例:
DataStream<Tuple2<String, Integer>> windowedStream = stream
.keyBy(keySelector)
.countWindow(10)
.sum(1);
🔍 特点:
属性 |
描述 |
类型 |
Keyed 或 Non-Keyed |
时间戳 |
无时间概念,仅按元素数量划分 |
触发机制 |
元素数量达到设定值 |
应用场景 |
当数据量稳定但时间不确定时使用(如每100个传感器读数统计一次) |
⏱️ 3. 基于时间驱动的滑动时间窗口(Sliding Time Window - Time-based)
✅ 定义:
- 窗口每隔一定时间“滑动”一次,窗口长度固定。
- 窗口之间有重叠。
🕒 示例:
DataStream<Tuple2<String, Integer>> windowedStream = stream
.keyBy(keySelector)
.window(SlidingProcessingTimeWindows.of(Time.seconds(10), Time.seconds(5)))
.sum(1);
🔍 特点:
属性 |
描述 |
类型 |
Keyed 或 Non-Keyed |
时间戳 |
依赖事件时间或处理时间 |
触发机制 |
固定时间间隔触发 |
应用场景 |
需要连续、实时更新统计数据(如每5秒查看过去10秒的平均值) |
📐 4. 基于事件驱动的滑动时间窗口(Sliding Count Window - Event-based)
✅ 定义:
- 每隔固定数量的元素滑动一次窗口,窗口长度也以元素个数为单位。
- 窗口之间可以部分重叠。
📏 示例:
DataStream<Tuple2<String, Integer>> windowedStream = stream
.keyBy(keySelector)
.countWindow(10, 5)
.sum(1);
🔍 特点:
属性 |
描述 |
类型 |
Keyed 或 Non-Keyed |
时间戳 |
无时间概念,仅基于元素数量 |
触发机制 |
元素数量达到设定滑动步长 |
应用场景 |
数据速率不均,需要定期更新统计(如每100个请求统计前200个的平均响应时间) |
🛎️ 5. 会话窗口(Session Window)
✅ 定义:
- 根据活动间隙(gap) 来划分窗口。
- 如果两个元素之间的时间差超过设定的 gap,则属于不同的窗口。
🕒 示例:
DataStream<Tuple2<String, Integer>> windowedStream = stream
.keyBy(keySelector)
.window(EventTimeSessionWindows.withGap(Time.minutes(1)))
.sum(1);
🔍 特点:
属性 |
描述 |
类型 |
Keyed 或 Non-Keyed |
时间戳 |
通常基于事件时间 |
触发机制 |
检测到会话间隔(gap) |
应用场景 |
用户行为分析(如点击流、登录日志等),识别用户活跃时间段 |
📊 总结对比表
窗口类型 |
划分依据 |
是否重叠 |
触发条件 |
示例 |
滚动时间窗口 |
时间 |
否 |
时间到达 |
TumblingEventTimeWindows.of(Time.seconds(5)) |
滚动计数窗口 |
元素个数 |
否 |
数量达到 |
countWindow(10) |
滑动时间窗口 |
时间 |
是 |
时间滑动 |
SlidingEventTimeWindows.of(Time.seconds(10), Time.seconds(5)) |
滑动计数窗口 |
元素个数 |
是 |
数量滑动 |
countWindow(10, 5) |
会话窗口 |
事件间隔 |
动态 |
间隔超过gap |
EventTimeSessionWindows.withGap(Time.minutes(1)) |
✅ 选择建议
场景 |
推荐窗口类型 |
实时监控每 N 秒汇总一次 |
滚动时间窗口 |
数据按批次处理(如每100条) |
滚动计数窗口 |
需要平滑的实时指标(如移动平均) |
滑动时间窗口 |
数据频率不规则但需定期统计 |
滑动计数窗口 |
分析用户行为(如点击流、登录会话) |
会话窗口 |