Flink 中的窗口用于切割无界的数据流成有界的块,以便进行计算。窗口主要有以下几种类型:
- 滑动窗口(Sliding Windows):固定大小的窗口,按照固定的滑动间隔滑动。
- 滑动跨度窗口(Sliding Window Over Time):按时间间隔生成窗口。
- 会话窗口(Session Windows):按会话活跃时间生成窗口,窗口间有一定的不活跃期。
- 全局窗口(Global Windows):将整个数据流视为一个窗口。
这些窗口的主要区别在于:
- 窗口大小:滑动窗口和滑动跨度窗口大小可配置,会话窗口大小不定。
- 生成规则:滑动窗口按记录数生成,滑动跨度窗口按时间生成,会话窗口按不活跃时间生成。
- 是否重叠:滑动窗口可重叠,会话窗口和全局窗口不可重叠。
- 使用场景:滑动窗口用于近期聚合,会话窗口用于用户行为分析,全局窗口用于总体统计。
我们可以通过 WindowedStream 的 window() 方法定义数据流上的窗口。
例如:
- 滑动窗口:
DataStream<T> windowedStream = inputStream.window(SlidingEventTimeWindows.of(Time.seconds(10), Time.seconds(5)));
- 滑动跨度窗口:
DataStream<T> windowedStream = inputStream.window(SlidingEventTimeWindows.of(Time.seconds(10)));
- 会话窗口:
DataStream<T> windowedStream = inputStream.window(EventTimeSessionWindows.withGap(Time.minutes(10)));
- 全局窗口:
DataStream<T> windowedStream = inputStream.window(GlobalWindows.create());
Flink 中的窗口机制可以将无界流式数据切分成有界块进行计算。