【发布时间】:2018-06-14 11:55:40
【问题描述】:
我喜欢在 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 的硬性限制吗?
【问题讨论】:
标签: avro spark-avro