主要有2种窗口,一个基于时间窗口,一个是基于数量窗口。

时间窗口中起止时间是,左闭右开





EventTime
指的是数据在设备上产生的时间。
这种模式下,不管数据何时到达或者顺序如何,都能得到一致的结果。
但是,在数据时间乱序的情况下,会产生一些延迟,性能会有影响。
ps: 1.12以后版本的flink,设置 事件时间窗口类型时(setStreamTimeCharacteristic )这个不需要设置,默认就是eventtime,
但是eventTime必须要设置水位线(assignTimestampsAndWatermarks,要指定时间字段),而基于处理时间的窗口processTime,不必须设置水位线。
Ingestion Time
指的是 数据接入flink的时间。
依赖算子所在主机的系统时钟。
接入时间位于,生成时间和处理时间之间。
事件接入时间模式,不能处理时间乱序和数据延迟问题。但是可以处理flink内部处理数据乱序问题。(该模式无法解决,数据到达flink之前,产生的乱序问题)
Processing Time
指的是算子在操作过程中,获取的主机时间。
该模式下,实时性最高。但是计算结果不一定准确。
主要用于计算精度不是很高,比如延时比较高的日志数据。
将事件时间和处理时间,进行区分,是flink的一大进步。(比如spark中是没有处理时间的,只有事件时间)



eg: 设置事件时间 EventTime(1.12以后版本的flink不需手动设置,默认就是EventTime)
import org.apache.flink.streaming.api.TimeCharacteristic
import org.apache.flink.streaming.api.scala.StreamExecutionEnvironment
object TimeWindowsTest {
def main(args: Array[String]): Unit = {
//create env
val env = StreamExecutionEnvironment.getExecutionEnvironment
//set the Event time windows
env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime)
//set the processingTime
env.setStreamTimeCharacteristic(TimeCharacteristic.ProcessingTime)
}
}