Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/402.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Avro字段默认值_Java_Maven_Avro - Fatal编程技术网

Java Avro字段默认值

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

我在设置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" ] }
 ]
}
我正在使用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的标准只是要求在模式中显式表达这种差异,而不是定义隐式默认值。