Java Avro字段默认值
我在设置Avro字段的默认值时遇到了一些问题。我有一个简单的模式,如下所示: data.avsc:Java Avro字段默认值,java,maven,avro,Java,Maven,Avro,我在设置Avro字段的默认值时遇到了一些问题。我有一个简单的模式,如下所示: data.avsc: { "namespace":"test", "type":"record", "name":"Data", "fields":[ { "name": "id", "type": [ "long", "null" ] }, { "name": "value", "type": [ "string", "null" ] }, { "name": "raw", "type
{
"namespace":"test",
"type":"record",
"name":"Data",
"fields":[
{ "name": "id", "type": [ "long", "null" ] },
{ "name": "value", "type": [ "string", "null" ] },
{ "name": "raw", "type": [ "bytes", "null" ] }
]
}
我正在使用AvroMaven插件v1.7.6生成Java模型
使用以下命令创建模型实例时:
Data Data=Data.newBuilder().build()代码>,失败时出现异常:
org.apache.avro.AvroRuntimeException:
org.apache.avro.AvroRuntimeException:字段id类型:联合职位:0未注册
设置并没有默认值
{"name": "xxx", "type": ["null", "boolean"], "default": null}
但是如果我指定“default”属性
{ "name": "id", "type": [ "long", "null" ], "default": "null" },
我不明白这个错误。我在文档中读到,联合中的第一个模式成为默认模式。所以我的问题是,为什么我仍然需要指定“default”属性?我如何使字段成为可选字段
如果我真的需要指定默认值,那么这对一个联合是如何工作的;我是否需要为联合中的每个模式指定默认值,以及在顺序/语法方面如何工作
谢谢。联合的默认值对应于联合的第一个架构()。您的并集定义为[“long”,“null”]
,因此默认值必须是一个长数字null
不是一个很长的数字,这就是为什么会出现错误
如果您仍然想将null
定义为默认值,那么首先将null模式放在前面,即将union改为[“null”,“long”]
。它是Avro末端的一个错误,标记为没有问题。
您需要添加默认属性以提及默认值
{"name": "xxx", "type": ["null", "boolean"], "default": null}
请参考。您必须在架构中提供“default”:null而不是“default”:“null”
,以使生成器方法正常工作我认为问题在于您使用的是生成器
根据Java API的定义:
使用生成器需要设置所有字段,即使这些字段为空
简单地将null放在类型联合中的第一位并不能使它成为可选的-这就是我如何得到它并仍然得到错误的原因。至少在我正在使用的Avro 1.7.5上需要添加默认null。请检查此项:。已定义完整的架构和字段规则表。覆盖所有默认的复杂类型。仅缺少“记录”字段类型,但应用相同的:{“类型”:[“null”,“名称”:“,“类型”:“记录”,“字段”:[]}]}这是Avro非常令人惊讶的行为。我希望这个错误更明确一些。对于数值,默认值必须为null,但当字符串类型为null时,它必须为“null”-即“default”:null}和“default”:“null”}字节的默认值是什么?我不会将其称为Avro中的错误。你可能会说这是一个糟糕的设计,对某些人来说绝对不是直观的,但这是一个故意的特性,与Avro中的其他规则是一致的。“这可能是空的”和“这可能是空的,并且可能完全丢失,在这种情况下,它被假定为空的”之间存在概念和字节级别的差异。Avro的标准只是要求在模式中显式表达这种差异,而不是定义隐式默认值。