目录
1.1分为 按键分区(Keyed)和非按键分区(Non-Keyed)
3.1增量聚合函数( ReduceFunction / AggregateFunction )
3.2全窗口函数( full window functions )
1.Flink窗口API
1.1分为 按键分区(Keyed)和非按键分区(Non-Keyed)
1.1.1按键分区窗口(Keyed Windows)
经过按键分区keyBy操作后,数据流会按照key被分为多条逻辑流(logical streams),这就是KeyedStream。基于KeyedStream进行窗口操作时,窗口计算会在多个并行子任务上同时执行。相同key的数据会被发送到同一个并行子任务,而窗口操作会基于每个key进行单独的处理。
每个key上都定义了一组窗口,各自独立地进行统计计算。
需要先对DataStream调用.keyBy()进行按键分区,然后再调用.window()定义窗口。
stream.keyBy(...)
.window(...)
1.1.2非按键分区(Non-Keyed Windows)
如果没有进行keyBy,那么原始的DataStream就不会分成多条逻辑流。这时窗口逻辑只能在一个任务(task)上执行,就相当于并行度变成了1。
没有keyby的窗口: 窗口内的所有数据进入同一个子任务,并行度值只能为1
stream.windowAll(...)
1.2窗口API的调用
窗口操作主要有两个部分 : 窗口分配器(Window Assigners) 和 窗口函数(Window Functions)
stream.keyBy(<key selector>)
.window(<window assigner>)
.aggregate(<window function>)
- keyby()指定一个分区,每个key都会单独进行处理
- window()传入一个窗口分配器,指定窗口类型
- aggregate()定义窗口具体的处理逻辑
2.窗口分配器
定义窗口分配器,调用window()方法。
传入一个WindowAssigner 作为参数,返回 WindowedStream。如果是非按键分区窗口,那么直接调用.windowAll()方法,同样传入一个 WindowAssigner,返回的是 AllWindowedStream。
窗口按照驱动类型可以分成时间窗口和计数窗口
1.2.1时间窗口
时间窗口又可以分为滚动、滑动和会话三种
(1)滚动处理时间窗口
stream.keyBy(...)
.window(TumblingProcessingTimeWindows.of(Time.seconds(5)))
.aggregate(...)
- TumblingProcessingTimeWindows 创建滚动窗口
- of方法中传入一个time类型的参数size,表示滚动窗口的大小为5秒
- of方法中传入两个time类型的参数 of(size,offset)表示(滚动窗口的大小,步长)
(2)滑动处理时间窗口
stream.keyBy(...)
.window(SlidingProcessingTimeWindows.of(Time.seconds(10),Time.seconds(5)))
.aggregate