Avro 1.12.0嵌套记录重定义报错问题求助
针对你遇到的Avro 1.12.0升级后,两个avsc文件里的同名同结构嵌套Provenance Record触发ParseContext抛出"Can't redefine"错误的问题(对应Jira编号AVRO-4076),这里提供几个可行的解决办法:
提取公共嵌套Record到独立文件
把Provenance这个公共嵌套Record单独定义在一个avsc文件里,然后在MessageKey和Programme的avsc文件中通过全限定名称引用它。这样Avro解析时只会加载一次该schema,避免重复定义的冲突。
示例:
新建provenance.avsc:{ "type": "record", "name": "Provenance", "namespace": "your.app.namespace", "fields": [ // 这里填你的Provenance字段定义 ] }在
MessageKey.avsc和Programme.avsc中引用:{ "type": "record", "name": "MessageKey", "namespace": "your.app.namespace", "fields": [ { "name": "provenance", "type": "your.app.namespace.Provenance" } ] }统一嵌套Record的namespace
如果不想拆分文件,确保两个avsc文件里的Provenance嵌套定义都显式指定相同的namespace,不要出现一个带namespace、一个不带的情况。这样解析器会识别为同一个schema,不会触发重复定义检查。临时降级Avro版本
如果上述方案暂时无法落地,可以先降级到Avro 1.11.x及以前的版本,恢复之前的兼容行为,等待AVRO-4076官方修复完成后再升级。自定义ParseContext逻辑(进阶)
要是必须使用1.12.0且不能修改avsc文件,可以修改Avro的ParseContext类中第219行附近的重复检查逻辑,忽略namespace不一致但结构完全相同的schema。不过这种方法需要维护自定义的Avro分支,仅作为临时应急方案,不推荐长期使用。
内容的提问来源于stack exchange,提问作者John Bubbles

