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" }, 

我没有得到这个错误。 我在文档中读到联合中的第一个模式成为默认模式。 所以我的问题是,为什么我还需要指定“默认”属性? 我怎么做一个字段可选?

如果我确实需要指定默认值,那么它对联合的作用如何; 我是否需要为联合中的每个模式指定默认值,以及它在顺序/语法方面如何工作?

谢谢。

union的默认值对应于union的第一个模式( Source )。 您的联合被定义为["long", "null"]因此默认值必须是长数字。 null不是一个很长的数字,这就是你收到错误的原因。

如果您仍希望将null定义为默认值,则首先放置null模式,即将union更改为["null", "long"]

这是Avro最终的一个错误标记为非Not A Problem 。 您需要添加默认属性以提及默认值。

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

请参考AVRO-1803 。

您必须在模式中提供"default": null而不是"default": "null"以使构建器方法起作用