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" },
_
このエラーは発生しません。ドキュメントで、ユニオンの最初のスキーマがデフォルトのスキーマになることを読みました。だから私の質問は、なぜ「デフォルト」プロパティを指定する必要があるのですか?フィールドをオプションにするにはどうすればよいですか?
デフォルト値を指定する必要がある場合、それはユニオンに対してどのように機能しますか。ユニオン内の各スキーマにデフォルト値を指定する必要がありますか?また、順序/構文に関してはどのように機能しますか?
ありがとう。
ユニオンのデフォルト値は、ユニオンの最初のスキーマに対応します( Source )。ユニオンは["long", "null"]
として定義されているため、デフォルト値は長い数値でなければなりません。 null
は長い数字ではないため、エラーが発生します。
null
をデフォルト値として定義したい場合は、nullスキーマを最初に置きます。つまり、ユニオンを["null", "long"]
に変更します。
そのabugはAvroの最後にあり、Not A Problem
。デフォルト値を記載するには、デフォルト属性を追加する必要があります。
{"name": "xxx", "type": ["null", "boolean"], "default": null}
AVRO-18 を参照してください。
"default": null
not "default": "null"
ビルダーメソッドを機能させるためのスキーマ