根据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似乎表明Schema Registry与模式引用不相称。
答案 0 :(得分:11)
我可以给字段和架构指定相同的名称,地址吗?
是的,您可以使用与字段名称相同的名称命名记录。
如果我想在多个其他模式中使用AddressUSRecord模式,而不仅仅是人,该怎么办?
您可以使用多种技术使用多个模式: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"
}
]
}
顺便说一句,这允许您从单独的文件中解析。
或者,您也可以以相同的方式解析引用模式的单个Union模式:
[
{
"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"
}
]
}
]
我想要一个与Confluent公司的架构注册表配合使用的解决方案。
模式注册表不支持单独解析模式,但它确实支持解析为union类型的后一个示例。
答案 1 :(得分:1)
您可以将namespace
设置为记录类型,然后在后续字段中使用{namespace}.{name}
作为type
参数。不幸的是,目前没有可能从其他模式文件中引用类型。