LoginSignup
0

More than 3 years have passed since last update.

Apache BeamのAvroCoderの話

Posted at

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ではありません

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0