🪟 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条) | 滚动计数窗口 |
需要平滑的实时指标(如移动平均) | 滑动时间窗口 |
数据频率不规则但需定期统计 | 滑动计数窗口 |
分析用户行为(如点击流、登录会话) | 会话窗口 |