Scala ListBuffer不能在Flink中用作POJO类型

时间:2019-12-16 07:36:53

标签: scala apache-flink flink-streaming

当我运行以下代码时。日志打印:

  

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字段怎么办?

1 个答案:

答案 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]。

来自安德烈

[1] https://ci.apache.org/projects/flink/flink-docs-release-1.9/dev/types_serialization.html#rules-for-pojo-types

[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