avro AVSC (json) 文件数组或模式重用
avro AVSC (json) file array or schema re-use
这与一个被问过无数次但我找不到明确答案的问题有关。
在用于定义 avro 模式的 AVSC (json) 语法中,没有 'import' 功能。所以似乎没有明确的方法来定义模式并在别处引用它。 (我知道 AVDL 支持 import
但 java 解析器还不允许 uuid
类型,尽管它已修补并将在 1.11 中修复)
我看到很多 'how to re-use schemas' 的答案都依赖于使用 avro maven plugin
来定义 'includes',如果您使用 java,这很好,但我我在多语言环境中工作。
我在 AVSC 文件中尝试过这种语法,它在 maven/java 中为我工作,但似乎完全没有记录:
[
// ^ note: starts with a top-level array
{
// schema 1
"type": "record",
"namespace": "com.mycompany",
"name": "Money",
"fields": [
{
"name": "amount",
"type": {
"type": "bytes",
"logicalType": "decimal",
"scale": 2,
"precision": 19
}
},
{
"name": "currency",
"type": "string",
"doc": "3-character ISO 4217 currency code"
}
]
},
{
// schema 2, references schema 1
"type": "record",
"namespace": "com.mycompany.budgeting"
"name": "BudgetsModified",
"fields": [
{
"name": "id",
"type": {
"type": "string",
"logicalType": "uuid"
}
},
{
"name": "amount",
// re-use
"type": "com.mycompany.Money"
}
]
}
]
但这实际上受支持还是只是 maven avro 插件的一个怪癖?
我特别希望解决的问题:
- 必须支持 java、python 和(理想情况下)打字稿(因此仅使用 maven 的解决方案并不好)
- 必须支持架构 referencing/re-use -- 我不想在每个需要它的架构中重新定义像
Money
(带货币的小数)这样的自定义元组
- 必须与 Confluent Schema Registry 互操作
but is this actually supported or just a quirk of the maven avro plugin?
这是 combining/referencing 模式的完全有效方式。事实上,在 python fastavro
库中 there is a load_schema
API 最初基本上就是这样做的;它会将所有模式加载到一个列表 (Avro Union) 中,因为这是解决问题的正确且简单的方法。
至于 must interoperate with Confluent Schema Registry
,我不知道架构注册表是如何工作的,也不知道它是否支持这种类型的联合架构,但希望它应该支持,因为架构是有效的。
这与一个被问过无数次但我找不到明确答案的问题有关。
在用于定义 avro 模式的 AVSC (json) 语法中,没有 'import' 功能。所以似乎没有明确的方法来定义模式并在别处引用它。 (我知道 AVDL 支持 import
但 java 解析器还不允许 uuid
类型,尽管它已修补并将在 1.11 中修复)
我看到很多 'how to re-use schemas' 的答案都依赖于使用 avro maven plugin
来定义 'includes',如果您使用 java,这很好,但我我在多语言环境中工作。
我在 AVSC 文件中尝试过这种语法,它在 maven/java 中为我工作,但似乎完全没有记录:
[
// ^ note: starts with a top-level array
{
// schema 1
"type": "record",
"namespace": "com.mycompany",
"name": "Money",
"fields": [
{
"name": "amount",
"type": {
"type": "bytes",
"logicalType": "decimal",
"scale": 2,
"precision": 19
}
},
{
"name": "currency",
"type": "string",
"doc": "3-character ISO 4217 currency code"
}
]
},
{
// schema 2, references schema 1
"type": "record",
"namespace": "com.mycompany.budgeting"
"name": "BudgetsModified",
"fields": [
{
"name": "id",
"type": {
"type": "string",
"logicalType": "uuid"
}
},
{
"name": "amount",
// re-use
"type": "com.mycompany.Money"
}
]
}
]
但这实际上受支持还是只是 maven avro 插件的一个怪癖?
我特别希望解决的问题:
- 必须支持 java、python 和(理想情况下)打字稿(因此仅使用 maven 的解决方案并不好)
- 必须支持架构 referencing/re-use -- 我不想在每个需要它的架构中重新定义像
Money
(带货币的小数)这样的自定义元组 - 必须与 Confluent Schema Registry 互操作
but is this actually supported or just a quirk of the maven avro plugin?
这是 combining/referencing 模式的完全有效方式。事实上,在 python fastavro
库中 there is a load_schema
API 最初基本上就是这样做的;它会将所有模式加载到一个列表 (Avro Union) 中,因为这是解决问题的正确且简单的方法。
至于 must interoperate with Confluent Schema Registry
,我不知道架构注册表是如何工作的,也不知道它是否支持这种类型的联合架构,但希望它应该支持,因为架构是有效的。