【问题标题】:How can I code nullable objects in Google Cloud Dataflow?如何在 Google Cloud Dataflow 中编码可为空的对象?
【发布时间】:2015-09-01 23:27:46
【问题描述】:

这篇文章旨在回答以下问题:

  • 哪些内置Coders 支持可为空值?
  • 如何编码可为空的对象?
  • 具有可为空字段的类呢?
  • 带有null 条目的集合呢?

【问题讨论】:

    标签: google-cloud-dataflow


    【解决方案1】:

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

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

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

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

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

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

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

    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&lt;MyClass&gt; - 它应该自动使用带有嵌套 AvroCoderListCoder

      同样,List&lt;String&gt; 可能带有-null 条目可以使用编码器进行编码:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-29
      • 2019-03-07
      • 2019-09-26
      • 2020-04-04
      • 2022-11-11
      • 1970-01-01
      相关资源
      最近更新 更多