Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在Apache Beam中为我的PCollection使用AutoValue数据类型?_Java_Google Cloud Dataflow_Apache Beam - Fatal编程技术网

Java 如何在Apache Beam中为我的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试图选择一个编码器时就会出现错误。我

我想在PCollection中将AutoValue数据类用作对象类型,但在使用自动编码器时遇到问题:

@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提供此参考。我能够找出一个约束条件,我已经在上面作为一个单独的答案提到过。你提到的还有其他问题吗?