Java 如何在Apache Beam中为我的PCollection使用AutoValue数据类型?
我想在PCollection中将AutoValue数据类用作对象类型,但在使用自动编码器时遇到问题:Java 如何在Apache Beam中为我的PCollection使用AutoValue数据类型?,java,google-cloud-dataflow,apache-beam,Java,Google Cloud Dataflow,Apache Beam,我想在PCollection中将AutoValue数据类用作对象类型,但在使用自动编码器时遇到问题: @AutoValue 公共抽象类MyPersonClass{ 公共抽象字符串getName(); 公共抽象整数getAge(); 公共抽象浮点数getHeight(); 公共静态MyPersonClass创建(字符串名称、整数年龄、浮动高度){ 返回新的AutoValue\u MyPersonClass(姓名、年龄、身高); } } 每当我使用它时,Beam试图选择一个编码器时就会出现错误。我
@AutoValue
公共抽象类MyPersonClass{
公共抽象字符串getName();
公共抽象整数getAge();
公共抽象浮点数getHeight();
公共静态MyPersonClass创建(字符串名称、整数年龄、浮动高度){
返回新的AutoValue\u MyPersonClass(姓名、年龄、身高);
}
}
每当我使用它时,Beam试图选择一个编码器时就会出现错误。我不想为它定义我自己的编码器
如何使用编码器推断AutoValue类的模式?或者可以自动推断不同的编码器吗?Beam有一个实用程序,可以自动推断不同数据类的模式,包括Java bean、具有getter和setter的bean、Avro记录、协议缓冲区和AutoValue类 您只需要使用相应的
SchemaProvider
()添加DefaultSchema
注释
此注释适用于AutoValue生成器,因此如果您使用的是AutoValue.Builder模式,则不需要任何其他内容
如果您使用的是create
函数,如本例所示,您可以添加SchemaCreate
注释,如下所示:
import org.apache.beam.sdk.schemas.AutoValueSchema;
导入org.apache.beam.sdk.schemas.annotations.DefaultSchema;
导入org.apache.beam.sdk.schemas.annotations.SchemaCreate;
@DefaultSchema(AutoValueSchema.class)
@自动值
公共抽象类MyPersonClass{
公共抽象字符串getName();
公共抽象整数getAge();
公共抽象浮点数getHeight();
@阴谋
公共静态MyPersonClass创建(字符串名称、整数年龄、浮动高度){
返回新的AutoValue\u MyPersonClass(姓名、年龄、身高);
}
}
最后,如果您自己无法修改该类(可能是因为您不拥有源代码) 包含AutoValue类的代码),您可以按如下方式手动注册它:
pipeline.getSchemaRegistry().registerSchemaProvider(
MyPersonClass.class,新的AutoValueSchema());
公认的答案非常好
我的2美分,加上AutoValueSchema中存在的一个约束ReflectionUtils#isgter,它希望AutoValue的字段遵循get*约定。
如果遵循将getter命名为field()而不是getField()的约定,则AutoValueSchema不会将它们注册为实际的getter方法,因此也不会将它们注册为用于模式创建的属性。(最后一点对我来说有些模糊,因为我不确定通过getter识别属性的完整流程,必须更详细地阅读源代码)
因此,到目前为止,您必须将所有的AutoValue getter命名为get*(),以便它能够正确地使用Beam的AutoValueSchema
请参阅:和了解更多详细信息。不过,编码器存在严重问题-请参阅BEAM-1891。感谢@AlessandroSantini提供此参考。我能够找出一个约束条件,我已经在上面作为一个单独的答案提到过。你提到的还有其他问题吗?