阿夫罗字段默认值

2022-08-31 16:02:02

我在为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: Field id type:UNION pos:0未设置且没有默认值。

但是如果我指定“默认”属性,

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

我没有得到这个错误。我在文档中读到,联合中的第一个架构成为默认架构。所以我的问题是,为什么我仍然需要指定“默认”属性?否则,如何使字段成为可选字段?

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

谢谢。


答案 1

联合的默认值对应于联合的第一个架构()。您的并集被定义为因此默认值必须是长数字。 不是一个很长的数字,这就是为什么你得到一个错误。["long", "null"]null

如果您仍然想定义为默认值,则首先放置空架构,即将联合更改为。null["null", "long"]


答案 2

它是Avro末端的一个错误,被标记为.您需要添加默认属性来提及默认值。Not A Problem

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

请参阅AVRO-1803


推荐