Serialization 为什么可以';t Beam AvroIO使用运行时参数以及如何在数据流模板中使用AvroIO?

Serialization 为什么可以';t Beam AvroIO使用运行时参数以及如何在数据流模板中使用AvroIO?,serialization,avro,google-cloud-dataflow,apache-beam,Serialization,Avro,Google Cloud Dataflow,Apache Beam,我试图在Dataflow中结合使用运行时参数和AvroIO,但却遇到了序列化问题(java.io.NotSerializableException:org.apache.avro.Schema$RecordSchema)。然后我发现本页底部的表格中缺少AvroIO: 我猜这是由于一些Avro类的不可移植性,是真的吗?有计划解决这个问题吗 如果没有,如果我需要在写入Avro文件的模板中使用运行时参数,我应该怎么做?我是否必须放弃模板,以某种方式让我的服务运行,并在每次需要时以标准方式部署作业?这意

我试图在Dataflow中结合使用运行时参数和AvroIO,但却遇到了序列化问题(
java.io.NotSerializableException:org.apache.avro.Schema$RecordSchema
)。然后我发现本页底部的表格中缺少AvroIO:

我猜这是由于一些Avro类的不可移植性,是真的吗?有计划解决这个问题吗


如果没有,如果我需要在写入Avro文件的模板中使用运行时参数,我应该怎么做?我是否必须放弃模板,以某种方式让我的服务运行,并在每次需要时以标准方式部署作业?这意味着在我这方面会有很多额外的网络流量和/或基础设施代码。我有点不相信我是第一个需要同时运行模板作业和使用Avro的人。人们是如何解决这个问题的?

使用带有特定IO的模板要求IO必须接受将由模板填写的任何参数的
ValueProvider
版本。AvroIO尚未修改为接受
ValueProvider
参数,因此它还不支持运行时参数


鉴于上述情况,我不确定您从何处获得可序列化异常,或者如何将
RuntimeValueProvider
传递给
AvroIO
。要实现这一点,
AvroIO
需要进行更改,以支持适当的参数化——可能需要一个模式字符串——此时您应该能够将模式的
RuntimeValueProvider
传递给它。

Avro IO确实支持值提供程序:
org.apache.beam.sdk.IO.AvroIO.Write\35;(org.apache.beam.sdk.options.ValueProvider)
(beam sdk 2.0.0)确实如此。我在看AvroIO.read(),但AvroIO.write()是不支持ValueProviders。查看实现,它会导致它使用匿名内部类,该类捕获不可序列化的写入类字段。提交后应修复此问题。感谢快速响应和修复,合并后将在我们测试时更新。