我喜欢在 Avro 模式中多次使用相同的记录类型。考虑这个模式定义
{ “类型”:“记录”, "name": "订单簿", “命名空间”:“my.types”, "doc": "测试订单更新", “领域”:[ { “名称”:“出价”, “类型”: { “类型”:“数组”, “项目”: { “类型”:“记录”, "name": "OrderBookVolume", “命名空间”:“my.types”, “领域”:[ { “名称”:“价格”, “类型”:“双” }, { “名称”:“体积”, “类型”:“双” } ] } } }, { “姓名”:“询问”, “类型”: { “类型”:“数组”, “项目”: { “类型”:“记录”, "name": "OrderBookVolume", “命名空间”:“my.types”, “领域”:[ { “名称”:“价格”, “类型”:“双” }, { “名称”:“体积”, “类型”:“双” } ] } } } ] }
这不是有效的 Avro 架构,并且 Avro 架构解析器失败并显示
org.apache.avro.SchemaParseException:无法重新定义:my.types.OrderBookVolume
我可以通过将 OrderBookVolume 移动到两个不同的命名空间来使类型唯一来解决此问题:
{ “类型”:“记录”, "name": "订单簿", “命名空间”:“my.types”, "doc": "测试订单更新", “领域”:[ { “名称”:“出价”, “类型”: { “类型”:“数组”, “项目”: { “类型”:“记录”, "name": "OrderBookVolume", “命名空间”:“my.types.bid”, “领域”:[ { “名称”:“价格”, “类型”:“双” }, { “名称”:“体积”, “类型”:“双” } ] } } }, { “姓名”:“询问”, “类型”: { “类型”:“数组”, “项目”: { “类型”:“记录”, "name": "OrderBookVolume", “命名空间”:“my.types.ask”, “领域”:[ { “名称”:“价格”, “类型”:“双” }, { “名称”:“体积”, “类型”:“双” } ] } } } ] }
这不是一个有效的解决方案,因为 Avro 代码生成会生成两个不同的类,如果我想将该类型也用于其他事情而不仅仅是 deser 和 ser,这将非常烦人。
此问题与此问题有关: Avro Spark issue #73
通过在命名空间前面加上外部记录名称,增加了同名嵌套记录的区别。他们的用例可能纯粹与存储相关,因此它可能对他们有用,但对我们无效。
有人知道更好的解决方案吗?这是 Avro 的硬性限制吗?