1 reduce对于非窗口
link有两种reduce的方式,一种是正常的reduce,一种是windows窗口的reduce,本文主要介绍两种reduce方式的区别
1、正常的reduce
1.1 代码示例
val resultResult = inputstream
.keyBy(_.sensor_id)
.reduce(new ReduceFunction[SensorReading] {
override def reduce(t: SensorReading, t1: SensorReading): SensorReading = {
new SensorReading(t.sensor_id,t.timestamp,t.temperature + t1.temperature)
}
})
从代码中可以看到reduce是跟在keyBy后面的,这时作用于reduce的类是一个KeyStream的类,reduce会保存之前计算的结果,然后和新的数据进行累加,所以每次输出的都是历史所有的数据的总和。
在上面的override def reduce(t: SensorReading, t1: SensorReading)中,第一个参数t是保存的历史数据,t1是最新的数据。
注:keyBy只是按KEY区分数据到不同的task处理,并不一定是将数据分组发送。
2、window的reduce
2.1 代码示例
val resultResult = inputstream
.assignTimestampsAndWatermarks(new SensorReadingWatermark())
.keyBy(_.sensor_id)
.timeWindow(Time.seconds(5))
.trigger(new SensorTrigger())
.reduce(new ReduceFunction[SensorReading] {
override def reduce(t: SensorReading, t1: SensorReading): SensorReading = {
new SensorReading(t.sensor_id,t.timestamp,t.temperature + t1.temperature)
}
})
在该示例中,reduce是跟在窗口算子的后面的,这时作用于reduce的类是一个WindowedStream。
既然是针对WindowedStream的操作,很显然,每次reduce的操作都是针对同一个窗口内同一个key的数据进行计算,每个窗口计算完成后,才会把数据发出来。
。
原文链接:https://blog.csdn.net/chenzhiang1/article/details/114401344