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

时间:2015-09-01 23:27:47

标签: google-cloud-dataflow

本文旨在回答以下问题:

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

1 个答案:

答案 0 :(得分:5)

您可以在DataflowJavaSDK source

中检查内置编码器

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

可以使用下面列出的技术对可空值进行编码。

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

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

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

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

  2. 我们建议使用NullableCoder对可自由对象进行编码。这实现了#1中的策略。

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

    PCollection<String> output =
        p.apply(Create.of(null, "test1", null, "test2", null)
            .withCoder(NullableCoder.of(String.class)));
    
  3. 只要嵌套编码器支持null字段/对象,许多编码器都支持嵌套的null字段/对象。

    例如,SDK应该能够使用CoderRegistry的默认List<MyClass>来推断工作编码器 - 它应该自动使用带有嵌套ListCoder的{​​{1}} }。

    同样,可以使用编码器编码可能带有AvroCoder条目的List<String>

    null
  4. 最后,在某些情况下,编码器必须是确定性的,例如,用于Coder<List<String>> coder = ListCoder.of(NullableCoder.of(String.class)) 的密钥。在GroupByKey中,只要基类型的AvroCoder本身具有确定性,@Nullable字段就会被确定性地编码。同样,使用Coder不应影响是否可以确定性地编码对象。