当前位置: 首页 > 知识库问答 >
问题:

Avro字段默认值

陆飞捷
2023-03-14

我在设置Avro字段的默认值时遇到了一些问题。我有一个简单的模式,如下所示:

数据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插件v1。7.6生成Java模型。

当我使用:Data data=Data.newBuilder(). build();创建模型的实例时,它会失败,但有一个异常

org.apache.avro.AvroRuntimeExc0019:org.apache.avro.AvroRuntimeExc0019:字段id类型: UNION pos: 0未设置,也没有默认值。

但是如果我指定“default”属性,

{ "name": "id", "type": [ "long", "null" ], "default": "null" },

我不明白这个错误。我在文档中读到,联合中的第一个模式成为默认模式。所以我的问题是,为什么我仍然需要指定“default”属性?我如何使字段成为可选字段?

如果我确实需要指定缺省值,这对于联合是如何工作的;我是否需要为联合中的每个模式指定缺省值,以及在顺序/语法方面是如何工作的?

谢谢。

共有3个答案

胡高朗
2023-03-14

您必须在架构中提供默认值:nullnot默认值:null才能使构建器方法正常工作

公孙令秋
2023-03-14

这是Avro末端的一个bug,标记为不是问题。您需要添加默认属性以提及默认值。

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

请参考AVRO-1803。

汝宏伯
2023-03-14

联合的默认值对应于联合的第一个架构(源)。您的并集定义为[“long”,“null”],因此默认值必须是一个长数字null不是一个很长的数字,这就是为什么会出现错误。

如果仍要将null定义为默认值,则首先将null模式放在前面,即将联合更改为[“null”,“long”]

 类似资料:
  • 问题内容: 我在设置Avro字段的默认值时遇到了一些问题。我有一个简单的架构,如下所示: data.avsc: 我正在使用 avro-maven-plugin v1.7.6 生成Java模型。 当我使用:创建模型的实例时 ,它会失败并出现以下异常: org.apache.avro.AvroRuntimeException:org.apache.avro.AvroRuntimeException:字

  • 我正在尝试序列化一个avro模式,然后将其写入hortonworks模式注册表,但在写入操作期间收到以下错误消息。 这是avro模式 无论谁,如果我添加“null”作为联合的第一种类型,都会成功。avro联合类型需要“null”吗?在我的情况下,这将是不正确的数据表示,所以我不热衷于这样做。如果有什么不同,我使用avro 1.9.1。 此外,如果标签不正确,但找不到标签并且没有足够的代表来创建新标

  • avro.version= 在avro模式中,map type不支持缺省值。我尝试了以下不同的模式。 第一: 第二: 第三: Java代码如下: 我只希望constraintQuantities和RawQuanties为null。因为这些是可选字段。即使我没有将它们设置为null,它也会抛出异常。 最重要的是,方法生成java POJO,但无法构建该对象。 如果不设置它们为空,然后接收以下异常:

  • 问题内容: 我正在使用以下方法在ES中创建动态映射: 因此,每当我为具有字段()的文档建立索引时,它都会自动创建具有类型的字段()。因此,每当没有a时,我都会发送一个空字符串,然后引发异常。 有什么办法可以解决这个问题?我可以指定默认值吗? 问题答案: 您可以添加到所有字段,也可以全局设置: 仅字段: 全局设置 :

  • 我不明白为什么我应用程序会删除异常“字段'ID_Employeer'没有默认值”。 是我的主键,当我试图将任何信息保存到我的数据库时,我得到了这个异常,但是,当我只是试图从DB读取信息时,它是正常的。 我读了关于StackOverflow的主题,但我仍然不明白我应用程序中的答案。我正在使用Hibernate5.2.11。 我的: 我的冬眠: 下一个CharacterInfo类 主类 最后例外

  • 所以我有一个这样的avro记录(称之为v1): 我想添加一个区分大小写的字段,默认值为false(称为v2)。我的第一种方法是: 根据模式演变,这是向后和向前兼容的,因为具有新模式的读取器读取用旧写入器模式编码的记录将能够填充此字段默认值和具有旧模式的读取器将能够读取用新写入器模式编码的记录,因为它只会忽略新添加的字段。 添加此字段的另一种方法是添加默认值为null的