web-dev-qa-db-ja.com

Avroフィールドのデフォルト値

Avroフィールドのデフォルト値を設定する際に問題が発生しています。以下に示すような単純なスキーマがあります。

data.avsc:

_{
 "namespace":"test",
 "type":"record",
 "name":"Data",
 "fields":[
    { "name": "id", "type": [ "long", "null" ] },
    { "name": "value", "type": [ "string", "null" ] },
    { "name": "raw", "type": [ "bytes", "null" ] }
 ]
}
_

avro-maven-plugin v1.7.6を使用してJavaモデルを生成しています。

Data data = Data.newBuilder().build();を使用してモデルのインスタンスを作成すると、例外で失敗します。

org.Apache.avro.AvroRuntimeException:org.Apache.avro.AvroRuntimeException:フィールドIDタイプ:UNION pos:0は設定されておらず、デフォルト値はありません。

しかし、「デフォルト」プロパティを指定すると、

_{ "name": "id", "type": [ "long", "null" ], "default": "null" },
_

このエラーは発生しません。ドキュメントで、ユニオンの最初のスキーマがデフォルトのスキーマになることを読みました。だから私の質問は、なぜ「デフォルト」プロパティを指定する必要があるのですか?フィールドをオプションにするにはどうすればよいですか?

デフォルト値を指定する必要がある場合、それはユニオンに対してどのように機能しますか。ユニオン内の各スキーマにデフォルト値を指定する必要がありますか?また、順序/構文に関してはどのように機能しますか?

ありがとう。

32
Kesh

ユニオンのデフォルト値は、ユニオンの最初のスキーマに対応します( Source )。ユニオンは["long", "null"]として定義されているため、デフォルト値は長い数値でなければなりません。 nullは長い数字ではないため、エラーが発生します。

nullをデフォルト値として定義したい場合は、nullスキーマを最初に置きます。つまり、ユニオンを["null", "long"]に変更します。

49
H.Josef

そのabugはAvroの最後にあり、Not A Problem。デフォルト値を記載するには、デフォルト属性を追加する必要があります。

{"name": "xxx", "type": ["null", "boolean"], "default": null}

AVRO-18 を参照してください。

14
Rites

"default": null not "default": "null"ビルダーメソッドを機能させるためのスキーマ

4
blueberry