【发布时间】:2015-09-01 23:27:46
【问题描述】:
这篇文章旨在回答以下问题:
- 哪些内置
Coders 支持可为空值? - 如何编码可为空的对象?
- 具有可为空字段的类呢?
- 带有
null条目的集合呢?
【问题讨论】:
这篇文章旨在回答以下问题:
Coders 支持可为空值?null 条目的集合呢?【问题讨论】:
您可以检查DataflowJavaSDK source 中的内置编码器。
一些默认编码器不支持null 值,通常是为了提高效率。例如,DoubleCoder 总是使用 8 个字节编码 double;添加一点以反映 double 是否为 null 会为所有非 null 值添加(填充的)第 9 个字节。
可以使用下面概述的技术对可空值进行编码。
我们通常建议使用AvroCoder 对类进行编码。 AvroCoder 支持带有 org.apache.avro.reflect.Nullable 注释的可空字段:
@DefaultCoder(AvroCoder.class)
class MyClass {
@Nullable String nullableField;
}
有关更完整的代码示例,请参阅TrafficMaxLaneFlow。
AvroCoder 还支持在Union 中包含Null 的字段。
我们建议使用NullableCoder 对可空对象本身进行编码。这实现了 #1 中的策略。
例如,考虑以下工作代码:
PCollection<String> output =
p.apply(Create.of(null, "test1", null, "test2", null)
.withCoder(NullableCoder.of(String.class)));
许多编码器都支持嵌套的null 字段/对象,只要嵌套的编码器支持null 字段/对象。
例如,SDK 应该能够使用默认的CoderRegistry 推断出一个工作编码器 List<MyClass> - 它应该自动使用带有嵌套 AvroCoder 的 ListCoder。
同样,List<String> 可能带有-null 条目可以使用编码器进行编码:
Coder<List<String>> coder = ListCoder.of(NullableCoder.of(String.class))
最后,在某些情况下,编码器必须是确定性的,例如,用于GroupByKey 的密钥。在AvroCoder 中,只要基类型的Coder 本身是确定性的,@Nullable 字段就会被确定性编码。同样,使用NullableCoder 不应影响对象是否可以确定性地编码。
【讨论】: