gpt4 book ai didi

java - 如何以完全兼容的方式将枚举值添加到 AVRO 模式?

转载 作者:行者123 更新时间:2023-12-01 23:06:36 24 4
gpt4 key购买 nike

我在这样的 AVRO 模式中有一个枚举:

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

当使用 FULL(这意味着 BACKWARD 和 FORWARD)兼容模式时,我应该如何向枚举添加一个新符号?这不可能吗?

我读了Avro schema : is adding an enum value to existing schema backward compatible?但这没有帮助。

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

最佳答案

目前 AVRO 中似乎存在一个错误,它会影响版本 1.9.0、1.10.0、1.9.1、1.9.2、1.11.0、1.10.1、1.10.2 并进一步影响直到它被修复。

该错误在 avro 处理枚举默认值时出现。

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

A default value for this enumeration, used during resolution when the reader encounters a symbol from the writer that isn't defined in the reader's schema

然而事实并非如此,读取器端的反序列化器失败并出现异常 org.apache.avro.AvroTypeException: No match for C

我已经报告了错误 here , 并推送了一个再现测试 here

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

关于java - 如何以完全兼容的方式将枚举值添加到 AVRO 模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70753220/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com