如何在 Google Cloud Dataflow 中编写可为 null 的对象?
How can I code nullable objects in Google Cloud Dataflow?
此 post 旨在回答如下问题:
- 哪些内置
Coder
支持可空值?
- 如何对可为 null 的对象进行编码?
- 类 具有可为 null 的字段呢?
- 包含
null
个条目的集合呢?
您可以检查 DataflowJavaSDK source 中的内置编码器。
一些默认编码器不支持 null
值,通常是为了提高效率。例如,DoubleCoder
总是使用 8 个字节对 double
进行编码;添加一点以反映 double
是否为 null
会向所有非 null
值添加(填充的)第 9 个字节。
可以使用下面概述的技术对可为 null 的值进行编码。
我们一般推荐使用AvroCoder
编码类。 AvroCoder
支持使用 org.apache.avro.reflect.Nullable
注释注释的可空字段:
@DefaultCoder(AvroCoder.class)
class MyClass {
@Nullable String nullableField;
}
请参阅 TrafficMaxLaneFlow 以获得更完整的代码示例。
AvroCoder
还支持在 Union
.
中包含 Null
的字段
我们建议使用 NullableCoder
对可为 null 的对象本身进行编码。这实现了#1 中的策略。
例如,考虑以下工作代码:
PCollection<String> output =
p.apply(Create.of(null, "test1", null, "test2", null)
.withCoder(NullableCoder.of(String.class)));
嵌套null
fields/objects很多编码器都支持,只要嵌套编码器支持null
fields/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
不应影响对象是否可以确定性编码。
此 post 旨在回答如下问题:
- 哪些内置
Coder
支持可空值? - 如何对可为 null 的对象进行编码?
- 类 具有可为 null 的字段呢?
- 包含
null
个条目的集合呢?
您可以检查 DataflowJavaSDK source 中的内置编码器。
一些默认编码器不支持 null
值,通常是为了提高效率。例如,DoubleCoder
总是使用 8 个字节对 double
进行编码;添加一点以反映 double
是否为 null
会向所有非 null
值添加(填充的)第 9 个字节。
可以使用下面概述的技术对可为 null 的值进行编码。
我们一般推荐使用
AvroCoder
编码类。AvroCoder
支持使用org.apache.avro.reflect.Nullable
注释注释的可空字段:@DefaultCoder(AvroCoder.class) class MyClass { @Nullable String nullableField; }
请参阅 TrafficMaxLaneFlow 以获得更完整的代码示例。
AvroCoder
还支持在Union
. 中包含 我们建议使用
NullableCoder
对可为 null 的对象本身进行编码。这实现了#1 中的策略。例如,考虑以下工作代码:
PCollection<String> output = p.apply(Create.of(null, "test1", null, "test2", null) .withCoder(NullableCoder.of(String.class)));
嵌套
null
fields/objects很多编码器都支持,只要嵌套编码器支持null
fields/objects.例如,SDK 应该能够使用
List<MyClass>
的默认CoderRegistry
来推断工作编码器——它应该自动使用带有嵌套 [=] 的ListCoder
19=].类似地,一个
List<String>
可能有 -null
个条目可以用编码器编码:Coder<List<String>> coder = ListCoder.of(NullableCoder.of(String.class))
Null
的字段
最后,在某些情况下,编码器必须是确定性的,例如,用于 GroupByKey
的密钥。在 AvroCoder
中,只要基本类型的 Coder
本身是确定性的,@Nullable
字段就被确定性地编码。同样,使用 NullableCoder
不应影响对象是否可以确定性编码。