如何在 Google Cloud Dataflow 中编写可为 null 的对象?

How can I code nullable objects in Google Cloud Dataflow?

此 post 旨在回答如下问题:

您可以检查 DataflowJavaSDK source 中的内置编码器。

一些默认编码器不支持 null 值,通常是为了提高效率。例如,DoubleCoder 总是使用 8 个字节对 double 进行编码;添加一点以反映 double 是否为 null 会向所有非 null 值添加(填充的)第 9 个字节。

可以使用下面概述的技术对可为 null 的值进行编码。

  1. 我们一般推荐使用AvroCoder编码类。 AvroCoder 支持使用 org.apache.avro.reflect.Nullable 注释注释的可空字段:

    @DefaultCoder(AvroCoder.class)
    class MyClass {
      @Nullable String nullableField;
    }
    

    请参阅 TrafficMaxLaneFlow 以获得更完整的代码示例。

    AvroCoder 还支持在 Union.

  2. 中包含 Null 的字段
  3. 我们建议使用 NullableCoder 对可为 null 的对象本身进行编码。这实现了#1 中的策略。

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

    PCollection<String> output =
        p.apply(Create.of(null, "test1", null, "test2", null)
            .withCoder(NullableCoder.of(String.class)));
    
  4. 嵌套nullfields/objects很多编码器都支持,只要嵌套编码器支持nullfields/objects.

    例如,SDK 应该能够使用 List<MyClass> 的默认 CoderRegistry 来推断工作编码器——它应该自动使用带有嵌套 [=] 的 ListCoder 19=].

    类似地,一个 List<String> 可能有 -null 个条目可以用编码器编码:

    Coder<List<String>> coder = ListCoder.of(NullableCoder.of(String.class))
    

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