Flink的状态函数mapWithState使用,代码如下:
def main(args: Array[String]): Unit = {
val env = StreamExecutionEnvironment.getExecutionEnvironment
env.fromCollection(List(
(1L, 3L),
(1L, 5L),
(1L, 7L),
(1L, 4L),
(1L, 2L),
(2L, 7L),
(2L, 4L),
(2L, 2L)
)).keyBy(_._1)
.mapWithState[(Long,Long),(Long,Long)]((in:(Long,Long),count:Option[(Long,Long)]) =>
count match {
case Some(c)=>((in._1,in._2+c._2),Some(in._1+c._1,in._2+c._2))
case None => ( (in._1, in._2), Some(in._1,in._2) )
}
)
.print()
// the printed output will be (1,4) and (1,5)
env.execute("ExampleManagedState")
}
结果:
下面看一下keyStream.mapWithState
1.首先看一下有3个输入泛型1函数
1.R: TypeInformation (return返回类型)
2.S: TypeInformation (stateful状态类型)
3.T(输入类型)
4.fun: (T, Option[S]) => (R, Option[S]) 函数将输入泛型转化了R,状态泛型没有变化
2.mapper扩展了RichMapFunction类并实现了StatefulFunction特质,里面的map方法实际调用的是StatefulFunction特质的applyWithState。由于StatefulFunction特质已经定义一个私有变量ValueState[S]并且更新状态