gpt4 book ai didi

单个模式中的多个相同类型的Avro记录

转载 作者:行者123 更新时间:2023-12-03 16:30:14 25 4
gpt4 key购买 nike

我喜欢在 Avro 模式中多次使用相同的记录类型。考虑这个模式定义

{
"类型": "记录",
"name": "订单簿",
"namespace": "my.types",
"doc": "测试订单更新",
“领域”:[
{
"name": "投标",
“类型”: {
“类型”:“数组”,
“项目”: {
"类型": "记录",
"name": "OrderBookVolume",
"namespace": "my.types",
“领域”:[
{
"name": "价格",
“类型”:“双”
},
{
"name": "音量",
“类型”:“双”
}
]
}
}
},
{
"name": "问",
“类型”: {
“类型”:“数组”,
“项目”: {
"类型": "记录",
"name": "OrderBookVolume",
"namespace": "my.types",
“领域”:[
{
"name": "价格",
“类型”:“双”
},
{
"name": "音量",
“类型”:“双”
}
]
}
}
}
]
}

这不是有效的 Avro 架构,Avro 架构解析器失败并显示

org.apache.avro.SchemaParseException: Can't redefine: my.types.OrderBookVolume



我可以通过将 OrderBookVolume 移动到两个不同的命名空间来使类型唯一来解决这个问题:

{
"类型": "记录",
"name": "订单簿",
"namespace": "my.types",
"doc": "测试订单更新",
“领域”:[
{
"name": "投标",
“类型”: {
“类型”:“数组”,
“项目”: {
"类型": "记录",
"name": "OrderBookVolume",
"namespace": "my.types.bid",
“领域”:[
{
"name": "价格",
“类型”:“双”
},
{
"name": "音量",
“类型”:“双”
}
]
}
}
},
{
"name": "问",
“类型”: {
“类型”:“数组”,
“项目”: {
"类型": "记录",
"name": "OrderBookVolume",
"namespace": "my.types.ask",
“领域”:[
{
"name": "价格",
“类型”:“双”
},
{
"name": "音量",
“类型”:“双”
}
]
}
}
}
]
}

这不是一个有效的解决方案,因为 Avro 代码生成会生成两个不同的类,如果我喜欢将该类型也用于其他事物而不仅仅是用于 deser 和 ser,这将非常烦人。

此问题与此处的此问题有关:
Avro Spark issue #73

通过在命名空间前面加上外部记录名称,增加了对同名嵌套记录的区分。他们的用例可能纯粹是存储相关的,所以它可能对他们有用,但对我们不起作用。

有人知道更好的解决方案吗?这是 Avro 的硬限制吗?

最佳答案

它没有很好的文档记录,但 Avro 允许您通过使用被引用名称的完整命名空间来引用以前定义的名称。在您的情况下,以下代码将只生成一个类,由每个数组引用。它也很好地干燥了模式。

{
"type": "record",
"name": "OrderBook",
"namespace": "my.types",
"doc": "Test order update",
"fields": [
{
"name": "bids",
"type": {
"type": "array",
"items": {
"type": "record",
"name": "OrderBookVolume",
"namespace": "my.types.bid",
"fields": [
{
"name": "price",
"type": "double"
},
{
"name": "volume",
"type": "double"
}
]
}
}
},
{
"name": "asks",
"type": {
"type": "array",
"items": "my.types.bid.OrderBookVolume"
}
}
]
}

关于单个模式中的多个相同类型的Avro记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48100575/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com