本文旨在回答以下问题:
Coder
支持可以为空的值?null
条目的馆藏怎么样?答案 0 :(得分:5)
某些默认编码器不支持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
还支持在Null
中包含Union
的字段。
我们建议使用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>
来推断工作编码器 - 它应该自动使用带有嵌套ListCoder
的{{1}} }。
同样,可以使用编码器编码可能带有AvroCoder
条目的List<String>
:
null
最后,在某些情况下,编码器必须是确定性的,例如,用于Coder<List<String>> coder = ListCoder.of(NullableCoder.of(String.class))
的密钥。在GroupByKey
中,只要基类型的AvroCoder
本身具有确定性,@Nullable
字段就会被确定性地编码。同样,使用Coder
不应影响是否可以确定性地编码对象。