我喜欢在 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 的硬性限制吗?