如何在Google Cloud Dataflow中编码可以为空的对象?

Dan*_*rin 3 google-cloud-dataflow

本文旨在回答以下问题:

  • 哪个内置Coders支持可空值?
  • 如何编码可以为空的对象?
  • 有可空字段的类怎么样?
  • null条目的馆藏怎么样?

Dan*_*rin 5

您可以检查DataflowJavaSDK源中的内置编码器.

某些默认编码器不支持null值,通常是为了提高效率.例如,DoubleCoder始终double使用8个字节进行编码; 平添几分反映是否double就是null将一个(填充)第9字节添加到所有非null数值.

可以使用下面概述的技术对可空值进行编码.

  1. 我们通常建议使用AvroCoder编码类.AvroCoder支持使用org.apache.avro.reflect.Nullable注释注释的可空字段:

    @DefaultCoder(AvroCoder.class)
    class MyClass {
      @Nullable String nullableField;
    }
    
    Run Code Online (Sandbox Code Playgroud)

    有关更完整的代码示例,请参阅TrafficMaxLaneFlow.

    AvroCoder还支持包含Null在a中的字段Union.

  2. 我们建议使用NullableCoder自身编码可为空的对象.这实现了#1中的策略.

    例如,请考虑以下工作代码:

    PCollection<String> output =
        p.apply(Create.of(null, "test1", null, "test2", null)
            .withCoder(NullableCoder.of(String.class)));
    
    Run Code Online (Sandbox Code Playgroud)
  3. 嵌套null场/目的通过许多编码器,只要该嵌套编码器支持的支持,null场/对象.

    例如,SDK应该能够推断工作编码器使用默认CoderRegistryList<MyClass>-它应该自动使用ListCoder了嵌套AvroCoder.

    类似地,List<String>带有可能null条目的a可以用编码器编码:

    Coder<List<String>> coder = ListCoder.of(NullableCoder.of(String.class))
    
    Run Code Online (Sandbox Code Playgroud)

最后,在某些情况下,编码器必须是确定性的,例如,用于的密钥GroupByKey.在AvroCoder,@Nullable只要Coder基本类型本身是确定性的,就确定性地编码字段.类似地,使用NullableCoder不应影响是否可以确定性地编码对象.