关于Apache Beam的AvroCoder的讨论
AvroCoder是什么?
使用Avro格式进行数据的序列化和反序列化是Beam内置的编码器。
源代码在这里,javadoc在这里。
Coder是什么?
Beam使用的是用于数据序列化和反序列化的类。
Avro是什么?
这是关于序列化的格式(和周边生态系统)。
通过reflect机制,我们可以从Java类创建模式(例如)。
怎么使用? ?)
只需要在指定的类中加上类似下面的注释即可。此外,还需要一个无参数的构造函数。
@DefaultCoder(AvroCoder.class)
public class MyCustomElement {
...
}
而且,您还可以明确定义Avro的模式并创建编码器。
(在这种情况下,是通过CoderRegistry注册,而不是使用注解吗?)
AvroCoder有什么好处呢?
-
- 組み込みのcoderなのですぐに使える
-
- ジェネリクスなので任意のクラスに使える
引数なしのコンストラクタが必要、static/transietなフィールドは含まれないなどの制限はある
deterministicなcoderになりうる
(ならない場合もあります)
SerializableCoderやMapCoderはdeterministicにならない
确定性的?
这是coder的特性,它表明同一个对象可以在任何地方、任何时候具有相同的编码。
GroupBy和Dynamic Destination需要确定性编码器。
AvroCoder和确定性的
AvroCoder的确定性取决于要序列化的类,并在此处进行定义。
在Avro的数据类型中,可以理解为以下的感觉。
-
- deterministic
Avroの組み込み型(boolean,int,long,float,doubles,bytes)
Enum
deterministicでない
Fixed(固定長のバイナリデータ)
内容次第
Map,Record,Array,Union
String(※)
在使用Java和Avro创建动态模式时,可以在reflect文档中找到Java类型和Avro类型的对应关系。
因为判断很麻烦,所以调用verifyDeterministic方法进行确认也是一个不错的选择。
※ 白名单中指定了String、URI、BigDecimal等类,而其他(通过Stringable注解指定)的类则不确定。