1、ListState简介
Flink提供了3种基于KEY/VALUE的state的实现方式,分别是:
ValueState<T>
ListState<T>
ReducingState<T>
官方文档中关于state的使用可以参考这里:Working with State
之前文章中,有一个使用ValueState的例子:ValueState,而ValueState适用于拿到上一条记录,或者上一个窗口中的记录,即ValueState存放的数据仅仅是一条记录,这在很多情况下都很有用。例如上一个窗口中的某些值要传递到下一个窗口,或者上一条记录中的某个值要传递到下一个记录等等。
而ListState则是将需要某些值存到一个List中(Iterable),即缓存的数据不仅仅是1个值,而是多个值。这在很多情况下也很有用,例如计算的数值要包含全天的每一个记录,那么此时只有将每一个记录的值存成一个列表,才可以计算。
2、ListState例子
如何获取ListState?
先定义ListState,并override RichFunction的open方法:
var state : ListState[TransactionListState] = null
override def open(config : Configuration) : Unit = {
state = getRuntimeContext.getListState[TransactionListState](new ListStateDescriptor[TransactionListState]("VWAP List State",classOf[TransactionListState]))
}
其中,ListStateDescriptor类提供了几种不同的定义方式:
这里我选择了第一种,2个参数分别是ListStateDescriptor的名字以及typeClass。
查询列表与