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

Avro模式:添加具有默认值的新字段-直接默认值还是具有null的并集?

公德明
2023-03-14

所以我有一个这样的avro记录(称之为v1):

record MyRecord {
    array<string> keywords;
}

我想添加一个区分大小写的字段,默认值为false(称为v2)。我的第一种方法是:

record MyRecord {
    array<string> keywords;
    boolean caseSensitive = false;
}

根据模式演变,这是向后和向前兼容的,因为具有新模式v2的读取器读取用旧写入器模式v1编码的记录将能够填充此字段默认值和具有旧模式v1的读取器将能够读取用新写入器模式v2编码的记录,因为它只会忽略新添加的字段。

添加此字段的另一种方法是添加默认值为null的null和布尔值的类型,如下所示:

record MyRecord {
    array<string> keywords;
    union{null, boolean} caseSensitive = null;
}

这也是向后和向前兼容的。我可以看出,如果字段没有明确的默认值(例如名称、地址等),有时会希望使用第二种方法。但是考虑到我的用例有一个明确的默认值,我考虑使用第一个解决方案。我的问题是:我在这里还遗漏了什么其他担忧吗?


共有1个答案

阎丰羽
2023-03-14

在第一种情况下,编写器会有一个潜在的问题——显然编写器不使用默认值。因此,编写“旧数据”(缺少新字段——因此编写器仅发布带有“关键字”字段的记录)的编写器将针对第一个模式爆炸。使用第二个模式的相同编写器将成功,并且“case敏感”字段将在结果消息中设置为空。

 类似资料:
  • 问题内容: 我正在寻找将列添加到默认值为0的MySQL数据库的语法 参考 问题答案: 尝试这个: 从链接到的文档中: 要在页面下方查找搜索语法,请执行以下操作: column_definition子句对ADD和CHANGE使用与CREATE TABLE相同的语法。请参见第12.1.17节“创建表语法”。 并从链接页面: 注意那里的DEFAULT这个词。

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

  • 我在设置Avro字段的默认值时遇到了一些问题。我有一个简单的模式,如下所示: 数据avsc: 我使用的是avro maven插件v1。7.6生成Java模型。 当我使用:创建模型的实例时,它会失败,但有一个异常: org.apache.avro.AvroRuntimeExc0019:org.apache.avro.AvroRuntimeExc0019:字段id类型: UNION pos: 0未设置

  • 我有一个带有数组字段的AVRO模式。此数组字段包含作为另一个AVRO架构对象的项目。下面是我现在的代码。 此代码是“bars”的字段定义,它是一个包含“com.example.Bar”对象的数组。 我现在将默认设置为“null”,但是我想明确将默认值设置为3 Bar对象的数组。 假设我的酒吧有以下字段定义: 我想将“条”默认设置为 但是此代码不起作用。我应该如何设置对象的默认值?

  • 问题内容: 我在Django模型中添加了一个新的,不可为空的字段,并尝试使用迁移来部署该更改。如何将用于现有模型的默认值设置为这些模型的某些功能而不是常量? 例如,假设我以前有一个字段,而我刚刚添加了一个字段,该字段的值最初要设置为模型的。在迁移中我将如何做? 这就是我要开始的事情: 问题答案: 我刚刚学习了如何通过一次迁移来做到这一点! 当运行时,应要求你设置一个默认值。在这里定义所有可以使它满

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