Avro字段默认值

Kes*_*esh 34 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": [ "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"].

  • 简单地将null放在类型联合中并不会使它看似可选 - 这就是我拥有它并仍然得到错误.至少在我正在使用的Avro 1.7.5上需要添加默认空值. (11认同)
  • https://avro.apache.org/docs/1.7.7/spec.html#Unions确实提到了这一点. (3认同)

Rit*_*tes 17

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

{"name": "xxx", "type": ["null", "boolean"], "default": null}
Run Code Online (Sandbox Code Playgroud)

请参考AVRO-1803.

  • 我不会称这是 Avro 中的错误。你可能会说这是一个糟糕的设计,而且对某些人来说绝对不直观,但这是一个有意的功能,与 Avro 中的其他规则一致。“this 可以为 null”和“this 可以为 null,并且可以完全缺失,在这种情况下假定为 null”之间存在概念和字节级别的差异。Avro 的标准只要求在模式中显式表达差异,而不是定义隐式默认值。 (4认同)
  • 对于数值,默认值必须为空,但当字符串类型时,它必须为“空”——即“默认”:空}和“默认”:“空”} (3认同)

blu*_*rry 6

您必须提供架构中"default": null未提供的内容"default": "null"才能使builder方法起作用