我遇到了一些设置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" ] }
]
}
Run Code Online (Sandbox Code Playgroud)
我使用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" },
Run Code Online (Sandbox Code Playgroud)
我没有得到这个错误.我在文档中读到联合中的第一个模式成为默认模式.所以我的问题是,为什么我仍然需要指定"默认"属性?我怎么做一个字段可选?
如果我确实需要指定默认值,那么它对联合的作用如何; 我是否需要为联合中的每个模式指定默认值,以及它在顺序/语法方面如何工作?
谢谢.
H.J*_*sef 52
union的默认值对应于union的第一个模式(Source).您的联合被定义为["long", "null"]默认值必须是长数字.null这不是一个很长的数字,这就是你收到错误的原因.
如果您仍希望将其定义null为默认值,则首先放置null模式,即将union更改为["null", "long"].
Rit*_*tes 17
这是Avro的一个错误标记为Not A Problem.您需要添加默认属性以提及默认值.
{"name": "xxx", "type": ["null", "boolean"], "default": null}
Run Code Online (Sandbox Code Playgroud)
请参考AVRO-1803.
| 归档时间: |
|
| 查看次数: |
45846 次 |
| 最近记录: |