一 数据源
样例类
case class SensorReading(id:String,ts:Long,tm:Double){}
val env: StreamExecutionEnvironment = StreamExecutionEnvironment.getExecutionEnvironment
//设置时间语义 时间发生时间
env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime)
env.setParallelism(1) //测试 由于再未设置并行度的时候 会并行执行,在所有任务中取最小分区的watermaker 做水印往后传递
val socketSource: DataStream[String] = env.socketTextStream("localhost",7777)
//定义水印
val mapStream: DataStream[SensorReading] = socketSource
.map(data=>{
val split: Array[String] = data.split("\\W+")
SensorReading(split(0).trim, split(1).trim.toLong, split(2).trim.toDouble)
})
.assignTimestampsAndWatermarks(new BoundedOutOfOrdernessTimestampExtractor[SensorReading](Time.milliseconds(1000)) {
override def extractTimestamp(t: SensorReading): Long = {
println(t.ts * 1000)
t.ts*1000}
} )// 水印 整体窗口关闭时间延时1秒
二 滑动窗口
val maxStream: DataStream[SensorReading] = mapStream
.keyBy("id")
//和.timeWindow(Time.seconds(10),类似,窗口长度为10秒 滑动步长设置为5秒
.window(TumblingEventTimeWindows.of(Time.seconds(10),Time.seconds(5)))
// .timeWindow(Time.seconds(10), Time.seconds(5))
.maxBy("tm")
三 滚动窗口
val minTempPerWindowStream: DataStream[SensorReading] = mapStream
.keyBy("id")
// .timeWindow(Time.seconds(2))
.window(TumblingEventTimeWindows.of(Time.seconds(2))) //底层调用的方法
// .window(TumblingEventTimeWindows.of(Time.minutes(1),Time.hours(-8)))
.minBy("tm")
四 会话窗口
指定会话间隔为500毫秒
val sessionStream: DataStream[SensorReading] = mapStream
.keyBy("id")
.window(EventTimeSessionWindows.withGap(Time.milliseconds(500)))
// .timeWindow(Time.seconds(10), Time.seconds(5))
.maxBy("tm")
注意:
- 测试的时候需要设置整体的并行度为1
- 窗口关闭的时间为:水印 > 数据的event time+水印延时时间