state序列化问题

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

state序列化问题

shizk233
Hi all,

请教一下,State应该是通过StateDescriptor提取的类型信息来序列化/反序列化,
那么如果声明为接口类型,如ListState<List<String>>,但实际存入的是ArrayList/LinkedList,
会对类型信息提取产生不良影响吗?

按我的理解,ArrayList和LinkedList在序列化时的bytes组成结构应该是不太一样的。
但是都可以作为List<List<String>>来声明。

请求野生的大佬支援一下!
Reply | Threaded
Open this post in threaded view
|

Re: state序列化问题

Yun Tang
Hi

如果想要在list中保存String,也就是list中的每个元素格式是String,ListState的格式应该是 ListState<String>, 而不是 ListState<List<String>>,后者表示有一个list,list中的每一个元素均是一个list<String>

ListState 本身并不属于java的collection,所以不存在ArrayList 与 LinkedList的区别。

祝好
唐云
________________________________
From: shizk233 <[hidden email]>
Sent: Thursday, August 20, 2020 18:00
To: [hidden email] <[hidden email]>
Subject: state序列化问题

Hi all,

请教一下,State应该是通过StateDescriptor提取的类型信息来序列化/反序列化,
那么如果声明为接口类型,如ListState<List<String>>,但实际存入的是ArrayList/LinkedList,
会对类型信息提取产生不良影响吗?

按我的理解,ArrayList和LinkedList在序列化时的bytes组成结构应该是不太一样的。
但是都可以作为List<List<String>>来声明。

请求野生的大佬支援一下!
Reply | Threaded
Open this post in threaded view
|

Re: state序列化问题

shizk233
抱歉,是我表述不清楚,ListState<List<String>>只是举个例子,并不是我的应用场景实际的状态。
从实际考虑,我想利用MapState保存一系列特殊的计数器Map,也就是MapState<Long,Map<String,Long>>,主要用来做一个伪窗口,key是窗口的开始时间。

主要想知道,在MapStateDescriptor声明类型信息时,我是否应该把内部Map声明成明确的HashMap类型,而不是Map类型?

Yun Tang <[hidden email]> 于2020年8月21日周五 上午12:13写道:

> Hi
>
> 如果想要在list中保存String,也就是list中的每个元素格式是String,ListState的格式应该是
> ListState<String>, 而不是
> ListState<List<String>>,后者表示有一个list,list中的每一个元素均是一个list<String>
>
> ListState 本身并不属于java的collection,所以不存在ArrayList 与 LinkedList的区别。
>
> 祝好
> 唐云
> ________________________________
> From: shizk233 <[hidden email]>
> Sent: Thursday, August 20, 2020 18:00
> To: [hidden email] <[hidden email]>
> Subject: state序列化问题
>
> Hi all,
>
> 请教一下,State应该是通过StateDescriptor提取的类型信息来序列化/反序列化,
> 那么如果声明为接口类型,如ListState<List<String>>,但实际存入的是ArrayList/LinkedList,
> 会对类型信息提取产生不良影响吗?
>
> 按我的理解,ArrayList和LinkedList在序列化时的bytes组成结构应该是不太一样的。
> 但是都可以作为List<List<String>>来声明。
>
> 请求野生的大佬支援一下!
>
Reply | Threaded
Open this post in threaded view
|

Re: state序列化问题

Yun Tang
Hi

其实你的问题就是MapState中的value本身是java的map结构,也就是对应MapStateDescriptor里面的valueSerializer是否需要区分显示声明成HashMap类型,这个取决于你的value serializer实现,如果你用的是Flink内置的MapSerializer[1],没必要声明成HashMap类型。


[1] https://github.com/apache/flink/blob/master/flink-core/src/main/java/org/apache/flink/api/common/typeutils/base/MapSerializer.java


祝好
唐云

________________________________
From: shizk233 <[hidden email]>
Sent: Friday, August 21, 2020 10:51
To: [hidden email] <[hidden email]>
Subject: Re: state序列化问题

抱歉,是我表述不清楚,ListState<List<String>>只是举个例子,并不是我的应用场景实际的状态。
从实际考虑,我想利用MapState保存一系列特殊的计数器Map,也就是MapState<Long,Map<String,Long>>,主要用来做一个伪窗口,key是窗口的开始时间。

主要想知道,在MapStateDescriptor声明类型信息时,我是否应该把内部Map声明成明确的HashMap类型,而不是Map类型?

Yun Tang <[hidden email]> 于2020年8月21日周五 上午12:13写道:

> Hi
>
> 如果想要在list中保存String,也就是list中的每个元素格式是String,ListState的格式应该是
> ListState<String>, 而不是
> ListState<List<String>>,后者表示有一个list,list中的每一个元素均是一个list<String>
>
> ListState 本身并不属于java的collection,所以不存在ArrayList 与 LinkedList的区别。
>
> 祝好
> 唐云
> ________________________________
> From: shizk233 <[hidden email]>
> Sent: Thursday, August 20, 2020 18:00
> To: [hidden email] <[hidden email]>
> Subject: state序列化问题
>
> Hi all,
>
> 请教一下,State应该是通过StateDescriptor提取的类型信息来序列化/反序列化,
> 那么如果声明为接口类型,如ListState<List<String>>,但实际存入的是ArrayList/LinkedList,
> 会对类型信息提取产生不良影响吗?
>
> 按我的理解,ArrayList和LinkedList在序列化时的bytes组成结构应该是不太一样的。
> 但是都可以作为List<List<String>>来声明。
>
> 请求野生的大佬支援一下!
>
Reply | Threaded
Open this post in threaded view
|

Re: state序列化问题

shizk233
了解了!谢谢!

Yun Tang <[hidden email]> 于2020年8月21日周五 下午4:00写道:

> Hi
>
> 其实你的问题就是MapState中的value本身是java的map结构,也就是对应MapStateDescriptor里面的valueSerializer是否需要区分显示声明成HashMap类型,这个取决于你的value
> serializer实现,如果你用的是Flink内置的MapSerializer[1],没必要声明成HashMap类型。
>
>
> [1]
> https://github.com/apache/flink/blob/master/flink-core/src/main/java/org/apache/flink/api/common/typeutils/base/MapSerializer.java
>
>
> 祝好
> 唐云
>
> ________________________________
> From: shizk233 <[hidden email]>
> Sent: Friday, August 21, 2020 10:51
> To: [hidden email] <[hidden email]>
> Subject: Re: state序列化问题
>
> 抱歉,是我表述不清楚,ListState<List<String>>只是举个例子,并不是我的应用场景实际的状态。
>
> 从实际考虑,我想利用MapState保存一系列特殊的计数器Map,也就是MapState<Long,Map<String,Long>>,主要用来做一个伪窗口,key是窗口的开始时间。
>
> 主要想知道,在MapStateDescriptor声明类型信息时,我是否应该把内部Map声明成明确的HashMap类型,而不是Map类型?
>
> Yun Tang <[hidden email]> 于2020年8月21日周五 上午12:13写道:
>
> > Hi
> >
> > 如果想要在list中保存String,也就是list中的每个元素格式是String,ListState的格式应该是
> > ListState<String>, 而不是
> > ListState<List<String>>,后者表示有一个list,list中的每一个元素均是一个list<String>
> >
> > ListState 本身并不属于java的collection,所以不存在ArrayList 与 LinkedList的区别。
> >
> > 祝好
> > 唐云
> > ________________________________
> > From: shizk233 <[hidden email]>
> > Sent: Thursday, August 20, 2020 18:00
> > To: [hidden email] <[hidden email]>
> > Subject: state序列化问题
> >
> > Hi all,
> >
> > 请教一下,State应该是通过StateDescriptor提取的类型信息来序列化/反序列化,
> > 那么如果声明为接口类型,如ListState<List<String>>,但实际存入的是ArrayList/LinkedList,
> > 会对类型信息提取产生不良影响吗?
> >
> > 按我的理解,ArrayList和LinkedList在序列化时的bytes组成结构应该是不太一样的。
> > 但是都可以作为List<List<String>>来声明。
> >
> > 请求野生的大佬支援一下!
> >
>