Avro字段默认值

时间:2014-04-08 13:10:09

标签: 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" ] }
 ]
}

我正在使用 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" },

我没有收到此错误。我在文档中读到联合中的第一个模式成为默认模式。所以我的问题是,为什么我仍然需要指定“默认”属性?我怎么做一个字段可选?

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

感谢。

4 个答案:

答案 0 :(得分:46)

union的默认值对应于union的第一个模式(Source)。您的联合被定义为["long", "null"],因此默认值必须是长号。 null不是一个很长的数字,这就是你收到错误的原因。

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

答案 1 :(得分:12)

Avro的最后一个错误,标记为Not A Problem。 您需要添加默认属性以提及默认值。

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

请参阅AVRO-1803

答案 2 :(得分:1)

您必须在架构中提供"default": null而非"default": "null"才能使构建器方法正常工作

答案 3 :(得分:1)

我认为问题在于您正在使用构建器,

根据 Java API 的 documentation

<块引用>

使用构建器需要设置所有字段,即使它们为空