当我运行以下代码时。日志打印:
scala.collection.mutable.ListBuffer类不包含字段scala $ setter的setter $ collection $ mutable $ ListBuffer $$ start
类类scala.collection.mutable.ListBuffer不能用作POJO类型,因为并非所有字段都是有效的POJO字段,必须将其作为GenericType处理。
代码:
private lazy val schoolDescriptor = new ListStateDescriptor[School]("schoolDescriptor", classOf[School])
context.globalState.getListSate(schoolDescriptor).update(ListBuffer(new School))
类定义:
class School {
var classes: ListBuffer[Class] = ListBuffer()
}
class Class {
var students: ListBuffer[Class] = ListBuffer()
}
class Student {
var name = ""
}
如果POJO具有ListBuffer type字段,并且ListBuffer的元素也具有ListBuffer type字段怎么办?
答案 0 :(得分:0)
关于您关于不变性的问题的评论中已经有一些提示。
通常,我也建议这样做,因为当您使用Flink状态时,常规API合同是 如果您更新状态对象(schoolDescriptor),则必须使用它调用state#update。
这可能在不调用update的情况下适用于堆状态(并非始终由API保证),但不适用于例如用于RocksDB状态后端。 如果使用纯POJO [1],则序列化也容易得多。
在非POJO的情况下,一般的方法是实现自定义org.apache.flink.api.common.typeutils.TypeSerializer或注册自定义序列化器[2] 使用另一个状态描述符构造函数:ListStateDescriptor(String name,TypeSerializer typeSerializer) 或重构您的类以支持现成的序列化[3]。
来自安德烈
[2] https://ci.apache.org/projects/flink/flink-docs-release-1.9/dev/custom_serializers.html
[3] https://ci.apache.org/projects/flink/flink-docs-release-1.9/dev/types_serialization.html