[英]How to add an enum value to an AVRO schema in a FULL compatible way?
我在這樣的 AVO 模式中有一個枚舉:
{
"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 架構:是否向現有架構添加枚舉值向后兼容? 但這無濟於事。
每當我嘗試向符號添加新值時,即使我在枚舉上有默認值,架構注冊表中的兼容性檢查也會失敗。 經過一番測試,似乎添加一個新值是向后兼容但不向前兼容。 但是,由於我設置的默認值,我希望它也與 FORWARD 兼容。 事實上,舊的閱讀器模式應該能夠讀取新模式寫入的值,並在它不知道新符號時默認為“UNKNOWN”枚舉值。
將新符號添加到枚舉中不完全兼容,甚至不兼容 FORWARD。
見 ==> https://github.com/confluentinc/schema-registry/issues/880
看來目前 AVRO 中存在一個錯誤,該錯誤會影響版本 1.9.0、1.10.0、1.9.1、1.9.2、1.11.0、1.10.1、1.10.2 以及進一步直到它被修復。
該錯誤在於對枚舉默認值的 avro 處理。
根據具有舊模式的讀取器端的文檔,我們應該能夠反序列化包含由具有新模式的寫入器端生成的枚舉值的有效負載。 由於讀者不知道該值,因此應將其反序列化為默認值。
此枚舉的默認值,當讀取器遇到未在讀取器模式中定義的寫入器的符號時在解析期間使用
然而,事實並非如此,閱讀器端的反序列化器失敗,出現異常org.apache.avro.AvroTypeException: No match for C
。
我在這里報告了這個錯誤,並在這里推送了一個重現測試
希望它引起維護者的一些關注:)
我們可以使用符號級別的默認值來實現這一點,(通過在type
定義中移動default
)。 希望這可以幫助
{
"type": "record",
"name": "MySchema",
"namespace": "com.company",
"fields": [
{
"name": "color",
"type": {
"type": "enum",
"name": "Color",
"symbols": [
"UNKNOWN",
"GREEN",
"RED"
],
"default": "UNKNOWN"
}
}
]
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.