AvroCoderとは
データのシリアライズ・デシリアライズにAvro形式を使う、Beam組み込みのcoderです。
ソースコードはここに、javadocはここにあります。
Coderとは
Beamがデータのシリアライズ・デシリアライズに使うクラスです
Avroとは
シリアライズのフォーマット(と周辺のエコシステム)です。
reflectという仕組みで、Javaのクラスからスキーマを作成することも出来ます(例)。
どうやって使うの
coder指定したいクラスに、下みたいにアノテーション付ければ良いらしいです。
なお、引数なしのコンストラクタが必要です。
@DefaultCoder(AvroCoder.class)
public class MyCustomElement {
...
}
また、Avroのスキーマを明示的に定義してcoderを作ることも出来ます。
(この場合は、アノテーションではなくCoderRegistryで登録?)
AvroCoderの何がいいの
- 組み込みのcoderなのですぐに使える
- ジェネリクスなので任意のクラスに使える
- 引数なしのコンストラクタが必要、static/transietなフィールドは含まれないなどの制限はある
- deterministicなcoderになりうる
- (ならない場合もあります)
- SerializableCoderやMapCoderはdeterministicにならない
deterministic?
同じオブジェクトが、どこでもいつでも同じエンコーディングを持つかを示す、coderの性質です。
GroupByやDynamic Destinationはdeterministicなcoderを必要とします。
AvroCoderとdeterministic
AvroCoderがdeterministicかどうかは、シリアライズ対象のクラスによって決まり、ここらへんで定義されています。
Avroのデータ型で言うと、下のような感じです。
- deterministic
- Avroの組み込み型(boolean,int,long,float,doubles,bytes)
- Enum
- deterministicでない
- Fixed(固定長のバイナリデータ)
- 内容次第
- Map,Record,Array,Union
- String(※)
動的にスキーマ作る時のJavaの型とAvroの型の対応は、reflectのドキュメントにあります。
判定面倒なので、verifyDeterministicメソッド呼んで確認するのもいいかもしれません。
※ StringやURI、BigDecimalなどがホワイトリストで指定されており、その他(Stringableアノテーションで指定する)のクラスはdeterministicではありません