嵌套 Avro 模式
Nesting Avro schemas
根据this question关于嵌套Avro模式,嵌套记录模式的正确方法如下:
{
"name": "person",
"type": "record",
"fields": [
{"name": "firstname", "type": "string"},
{"name": "lastname", "type": "string"},
{
"name": "address",
"type": {
"type" : "record",
"name" : "AddressUSRecord",
"fields" : [
{"name": "streetaddress", "type": "string"},
{"name": "city", "type": "string"}
]
},
}
]
}
我不喜欢将字段命名为 address
而不得不为字段的架构指定一个不同的名称 (AddressUSRecord
)。我可以给字段和架构起相同的名称吗,address
?
如果我想在多个其他模式中使用 AddressUSRecord
模式,而不仅仅是 person
,该怎么办?如果我想在另一个模式中使用 AddressUSRecord
,比方说 business
,我是否必须将其命名为其他名称?
理想情况下,我想在单独的模式中定义 AddressUSRecord
,然后让 address
的类型引用 AddressUSRecord
。但是,尚不清楚 Avro 1.8.1 是否支持这种开箱即用的功能。 2014 article 表明子模式需要用自定义代码处理。在 Avro 1.8.1 中定义可重用模式的最佳方式是什么?
注意:我想要一个与 Confluent Inc. 的架构注册表一起使用的解决方案。有一个 Google Groups thread 似乎表明架构注册表不能很好地处理架构引用。
您可以将 namespace
设置为记录类型,然后在后续字段中使用 {namespace}.{name}
作为 type
参数。不幸的是,目前无法从其他模式文件中引用类型。
Can I give the field and schema the same name, address?
是的,您可以使用与字段名称相同的名称来命名记录。
What if I want to use the AddressUSRecord schema in multiple other schemas, not just person?
您可以使用多种技术来使用多个模式:avro 模式解析器客户端(JVM 和其他)允许您指定多个模式,通常是通过 names
参数(Java Schema$Parser/parse
方法允许多个模式 String
参数)。
然后您可以将依赖模式指定为命名类型:
{
"type": "record",
"name": "Address",
"fields": [
{
"name": "streetaddress",
"type": "string"
},
{
"name": "city",
"type": "string"
}
]
}
并且 运行 这通过父模式之前的解析器:
{
"name": "person",
"type": "record",
"fields": [
{
"name": "firstname",
"type": "string"
},
{
"name": "lastname",
"type": "string"
},
{
"name": "address",
"type": "Address"
}
]
}
顺便说一下,这允许您从单独的文件中进行解析。
或者,您也可以解析以相同方式引用模式的单个联合模式:
[
{
"type": "record",
"name": "Address",
"fields": [
{
"name": "streetaddress",
"type": "string"
},
{
"name": "city",
"type": "string"
}
]
},
{
"type": "record",
"name": "person",
"fields": [
{
"name": "firstname",
"type": "string"
},
{
"name": "lastname",
"type": "string"
},
{
"name": "address",
"type": "Address"
}
]
}
]
I'd like a solution that works with Confluent Inc.'s Schema Registry.
模式注册表不支持单独解析模式,但支持后一个解析为联合类型的示例。
根据this question关于嵌套Avro模式,嵌套记录模式的正确方法如下:
{
"name": "person",
"type": "record",
"fields": [
{"name": "firstname", "type": "string"},
{"name": "lastname", "type": "string"},
{
"name": "address",
"type": {
"type" : "record",
"name" : "AddressUSRecord",
"fields" : [
{"name": "streetaddress", "type": "string"},
{"name": "city", "type": "string"}
]
},
}
]
}
我不喜欢将字段命名为 address
而不得不为字段的架构指定一个不同的名称 (AddressUSRecord
)。我可以给字段和架构起相同的名称吗,address
?
如果我想在多个其他模式中使用 AddressUSRecord
模式,而不仅仅是 person
,该怎么办?如果我想在另一个模式中使用 AddressUSRecord
,比方说 business
,我是否必须将其命名为其他名称?
理想情况下,我想在单独的模式中定义 AddressUSRecord
,然后让 address
的类型引用 AddressUSRecord
。但是,尚不清楚 Avro 1.8.1 是否支持这种开箱即用的功能。 2014 article 表明子模式需要用自定义代码处理。在 Avro 1.8.1 中定义可重用模式的最佳方式是什么?
注意:我想要一个与 Confluent Inc. 的架构注册表一起使用的解决方案。有一个 Google Groups thread 似乎表明架构注册表不能很好地处理架构引用。
您可以将 namespace
设置为记录类型,然后在后续字段中使用 {namespace}.{name}
作为 type
参数。不幸的是,目前无法从其他模式文件中引用类型。
Can I give the field and schema the same name, address?
是的,您可以使用与字段名称相同的名称来命名记录。
What if I want to use the AddressUSRecord schema in multiple other schemas, not just person?
您可以使用多种技术来使用多个模式:avro 模式解析器客户端(JVM 和其他)允许您指定多个模式,通常是通过 names
参数(Java Schema$Parser/parse
方法允许多个模式 String
参数)。
然后您可以将依赖模式指定为命名类型:
{
"type": "record",
"name": "Address",
"fields": [
{
"name": "streetaddress",
"type": "string"
},
{
"name": "city",
"type": "string"
}
]
}
并且 运行 这通过父模式之前的解析器:
{
"name": "person",
"type": "record",
"fields": [
{
"name": "firstname",
"type": "string"
},
{
"name": "lastname",
"type": "string"
},
{
"name": "address",
"type": "Address"
}
]
}
顺便说一下,这允许您从单独的文件中进行解析。
或者,您也可以解析以相同方式引用模式的单个联合模式:
[
{
"type": "record",
"name": "Address",
"fields": [
{
"name": "streetaddress",
"type": "string"
},
{
"name": "city",
"type": "string"
}
]
},
{
"type": "record",
"name": "person",
"fields": [
{
"name": "firstname",
"type": "string"
},
{
"name": "lastname",
"type": "string"
},
{
"name": "address",
"type": "Address"
}
]
}
]
I'd like a solution that works with Confluent Inc.'s Schema Registry.
模式注册表不支持单独解析模式,但支持后一个解析为联合类型的示例。