listState问题

classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

listState问题

huang
Hi all,
我在使用listState的时候,通过get获取listState以后,想删除里面的元素。类似这样:
Iterable<String> it = listState.get();
Iterator<String> itor = it.iterator();
...
itor.remove();
如果选用Memory或者Fs StateBackend,ListState里的元素可以正确删除
如果选用RocksDB StateBackend,ListState里的元素不能删除,再调用update(list)才能将删除了元素的list更新到状态里面


我理解这是因为RocksDB StateBackend操作state需要序列化和反序列化的原因,不过每次删除元素都要update会不会效率很低,有更好的办法删除元素吗?


谢谢!
Reply | Threaded
Open this post in threaded view
|

Re: listState问题

Congxian Qiu
你好

现在是需要通过 update 来更新整个 state value 的

1. RocksDBListState#get 获取到的是一个反序列化之后内存 list 对象,对这个对象做任何操作都不会反应到 list state

2. 现在 RocksDBListState 把整个 list 作为一个 value 保存的,如果你需要获取整个
list,然后删除某个元素,然后再更新整个 list,在实现上都需要进行所有的反序列化 --> 删除元素 --> 序列化操作(这一点和
RocksDBMapState 不太一样)

Best,
Congxian


huang <[hidden email]> 于2019年7月8日周一 上午10:46写道:

> Hi all,
> 我在使用listState的时候,通过get获取listState以后,想删除里面的元素。类似这样:
> Iterable<String> it = listState.get();
> Iterator<String> itor = it.iterator();
> ...
> itor.remove();
> 如果选用Memory或者Fs StateBackend,ListState里的元素可以正确删除
> 如果选用RocksDB
> StateBackend,ListState里的元素不能删除,再调用update(list)才能将删除了元素的list更新到状态里面
>
>
> 我理解这是因为RocksDB
> StateBackend操作state需要序列化和反序列化的原因,不过每次删除元素都要update会不会效率很低,有更好的办法删除元素吗?
>
>
> 谢谢!