在watermark之前先说下时间的概念,在https://blog.51cto.com/mapengfei/2554577 里面有各种时间窗口,实际生产中那是以哪个时间为准产生的窗口呢? 事件发生的时间? 进入flink程序的时间?还是flink开始处理的时间
Flink提供了一套设计解决方案
设置可以在代码中env直接设置
val env = StreamExecutionEnvironment.getExecutionEnvironment
// env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime) //以事件时间作为窗口聚合
//env.setStreamTimeCharacteristic(TimeCharacteristic.IngestionTime) //以数据进入flink的时间作为窗口时间
// env.setStreamTimeCharacteristic(TimeCharacteristic.ProcessingTime) //以Flink实际处理时间作为窗口时间
时间语义
只能说不同的场景下,每个时间都有使用场景,具体根据实际情况来实施
在代码中设置
我们可以直接在代码中,对执行环境调用setStreamCharacteristic方法,设置流的时间特性
具体的时间,还需要从数据中提取时间戳(timestamp),
如果要用事件时间,还需要设置具体取的哪个字段和格式,否则flink也不知道你用的哪个字段
val env = StreamExecutionEnvironment.getExecutionEnvironment
//从调用时刻开始给env创建的每个stream追加时间特性
env.setStreamTimeCharcteristic(TimeCharacteristic.EventTime)