- 窗口:
一般真实的流都是无界的,窗口可以把无界的流进行切分,得到一个有界流。它会将数据分发到有限大小的桶内进行分析。
- window类型:
时间窗口 time window:滚动时间窗口,滑动时间窗口,会话窗口。
计数窗口 count window:滚动计数窗口,滑动计数窗口。
滚动窗口:tumbling window:将数据依据固定大小的窗口长度对数据进行切分。时间对齐,窗口长度固定,没有重叠。
滑动窗口:sliding window:滑动窗口是固定窗口的更广义的一种形式,滑动窗口由固定的窗口长度和滑动间隔组成。窗口长度固定,可以有重叠。
会话窗口:session window:由一系列事件组合一个指定时间长度的timeout间隙组成,也就是一段时间没有接到新数据就会生成新的窗口。特点:时间无对齐。
- window API:
窗口分配器:window()方法
我们可以用.window()来定义一个窗口,然后基于这个window去做一些聚合操作或者其它处理操作。注意window()方法必须在keyby方法之后才能用。
flink提供了更加简单的.timeWindow()和.countWindow(),用于定义时间窗口和计数窗口。
DataStream<Tuple2<String,Double>> minTempPerWindowStream = dataStream
.map(new MyMapper())
.keyby(data -> data.f0)
.timeWindow( Time.seconds(15) )
.minBy(1);
- 窗口函数(window function):
window function定义了窗口中要对收集的数据所做的计算操作。
可以分为两类:增量聚合函数,increment aggregation functions,每条数据到来就进行计算,保持一个简单的状态。
如reduceFunction,aggregateFunction
全窗口函数,full windowFunctions,先把窗口所有数据收集起来,等到计算的时候会遍历所有数据。
如processWindowFunction,WindowFunction
- 其他可选API:
.trigger()--触发器,定义窗口什么时候关闭,触发计算并输出结果。
.evictor()--移除器,定义移除某些数据的逻辑。
.allowedLateness(),允许处理迟到的数据。
.sideOutputLateData(),将迟到的数据放入侧输出流。
.getSideOutput(),获取侧输出流。