在@FieldAccess DoFn中无法使用Java Double获取可为空DOUBLE schema字段
解决方案
针对你遇到的@FieldAccess无法读取可为空DOUBLE字段的问题,这里有两种可行的解决方式:
方法1:使用Optional<Double>接收可为空字段
Beam的Schema系统原生支持java.util.Optional类型,当参数声明为Optional<Double>时,会自动匹配schema中可为空的DOUBLE字段,避免类型不匹配的异常:
@ProcessElement public void process(@Element @FieldAccess("field1") Optional<Double> field1) { // 按需处理空值,比如取默认值或直接使用 Double value = field1.orElse(0.0); // 执行你的业务逻辑 }
方法2:显式声明字段可为空
通过@SchemaField注解显式指定参数对应的字段允许为空,覆盖StaticSchemaInference默认的非空推断:
import org.apache.beam.sdk.schemas.annotations.SchemaField; @ProcessElement public void process(@Element @FieldAccess("field1") @SchemaField(nullable = true) Double field1) { // 业务逻辑,field1可以为null }
问题根源
Beam的StaticSchemaInference.fieldFromType()方法在处理Double包装类或double原始类型时,默认会推断出非空(NOT NULL)的DOUBLE类型,但你的schema中该字段是允许为空的DOUBLE类型,两者类型不匹配就触发了IllegalArgumentException。上述两种方法都能修正类型推断结果,使其与schema定义对齐。
内容的提问来源于stack exchange,提问作者Vergo
相关产品推荐
相关产品推荐

