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

如何以完全兼容的方式向AVRO模式添加枚举值?

吕自明
2023-03-14

我在AVO模式中有一个枚举,如下所示:

{
    "type": "record",
    "name": "MySchema",
    "namespace": "com.company",
    "fields": [
        {
            "name": "color",
            "type": {
                "type": "enum",
                "name": "Color",
                "symbols": [
                    "UNKNOWN",
                    "GREEN",
                    "RED"
                ]
            },
            "default": "UNKNOWN"
        }
    ]
}

当使用完全(即向后和向前)兼容模式时,我应该如何向枚举添加新符号?这不可能吗?

我阅读了Avro模式:向现有模式添加枚举值是否向后兼容?但无济于事。

每当我试图向符号添加一个新值时,它都会在模式注册表中的兼容性检查中失败,即使我在枚举中有一个默认值。经过一点测试,似乎添加一个新值是向后兼容的,而不是向前兼容的。然而,由于我设置的默认值,我希望它也是向前兼容的。事实上,旧的读取器模式应该能够读取新模式写入的值,并在不知道新符号时默认为“未知”枚举值。

共有2个答案

东方涛
2023-03-14

向枚举中添加新符号不完全兼容,甚至不兼容FORWARD。

看==

蒋栋
2023-03-14

AVRO中似乎目前存在一个错误,该错误会影响版本1.9.0,1.10.0,1.9.1,1.9.2,1.11.0,1.10.1,1.10.2以及进一步修复。

该错误是在对枚举默认值的avro处理中。

根据具有旧模式的读取器端的文档,我们应该能够反序列化包含由具有新模式的写入器端生成的枚举值的有效负载。由于读取器不知道该值,因此应将其反序列化为默认值。

此枚举的默认值,在解析过程中,当读取器遇到未在读取器架构中定义的来自写入器的符号时使用

然而,情况并非如此,读取器端的反序列化程序失败,出现异常<code>org.apache.avro。AvroTypeException:与C不匹配。

我在这里报告了错误,并在这里进行了繁殖测试

希望它能引起维护人员的注意:)

 类似资料:
  • 我正在使用SpringDoc,并试图以编程方式向OpenApi添加一个模式,但没有成功。 mySchema的描述没有添加到我在生成的YAML文件中看到的模式列表中,如果我试图引用它:

  • 如何以编程方式在Spring Boot中将内容添加到endpoint?文档指出,通过使用接口,这对于endpoint是可能的。endpoint也有什么吗? 我想在那里添加操作系统名称和版本以及其他运行时信息。

  • 让我们看看一个需要诉诸于代码的场景,来考虑为何此时使用枚举更为合适且实用。假设我们要处理 IP 地址。目前被广泛使用的两个主要 IP 标准:IPv4(version four)和 IPv6(version six)。这是我们的程序可能会遇到的所有可能的 IP 地址类型:所以可以 枚举 出所有可能的值,这也正是此枚举名字的由来。 任何一个 IP 地址要么是 IPv4 的要么是 IPv6 的,而且不能

  • 我正在使用从oracle db获取数据,并按下(两个键 我有一个Kafka流收听这个主题,并有avro Genericrecord。当我启动流时,我开始得到<code>ClassCastException:java.lang.Long不能强制转换为org.apache.avro.generic。GenericRecordconnect生成的架构具有数据类型为“long”的字段 有人对如何解决这个问

  • 我对使用Swift的UIKit相对较新。目前,我正在尝试制作一个简单的UITableView,其中包含每个单元格的几个UILabels(纯粹以编程方式),尽管我在尝试这样做时遇到了很多麻烦。我的代码如下: 这是当前在模拟器中显示的内容。 这是我想看到的。 我如何着手改变我先前存在的代码以得到我所寻求的最终结果?我有一种感觉,这与我的代理或数据源有关,但无论我做什么,我似乎总是迷路。任何帮助都将不胜

  • 我有一个avro模式定义,比如- 上线后,我们增加了另一个领域- CusterType被定义为null, string。即使在向合流注册表注册架构时,我们也会收到错误-正在注册的架构与早期架构不兼容。 如果有什么原因,请告诉我们。我们通过显式地将customerType默认为null来解决这个问题, Union{null, string}CusterType=null; 但不知何故,我觉得这不是必