Tia*_*ong 8 schema nested record avro
根据关于嵌套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"}
]
},
}
]
}
Run Code Online (Sandbox Code Playgroud)
我不喜欢给字段命名,address并且不得不为AddressUSRecord字段的模式提供不同的名称().我可以给字段和模式指定相同的名称address吗?
如果我想AddressUSRecord在多个其他模式中使用模式,而不仅仅是person?如果我想AddressUSRecord在另一个模式中使用,让我们说business,我是否必须将其命名为其他模式?
理想情况下,我想AddressUSRecord在单独的模式中定义,然后让address引用类型AddressUSRecord.但是,目前尚不清楚Avro 1.8.1是否支持这种开箱即用的功能.这篇2014年的文章表明,需要使用自定义代码处理子模式.在Avro 1.8.1中定义可重用模式的最佳方法是什么?
注意:我想要一个与Confluent Inc.的Schema Registry一起使用的解决方案.有一个Google Groups线程似乎表明Schema Registry与模式引用不相称.
小智 15
我可以给字段和模式指定相同的名称,地址吗?
是的,您可以使用与字段名称相同的名称命名记录.
如果我想在多个其他模式中使用AddressUSRecord模式,而不仅仅是人,该怎么办?
您可以使用多种技术使用多个模式:avro模式解析器客户端(JVM和其他)允许您指定多个模式,通常通过names参数(Java Schema$Parser/parse方法允许多个模式String参数).
然后,您可以将依赖模式指定为命名类型:
{
"type": "record",
"name": "Address",
"fields": [
{
"name": "streetaddress",
"type": "string"
},
{
"name": "city",
"type": "string"
}
]
}
Run Code Online (Sandbox Code Playgroud)
并在父模式之前通过解析器运行:
{
"name": "person",
"type": "record",
"fields": [
{
"name": "firstname",
"type": "string"
},
{
"name": "lastname",
"type": "string"
},
{
"name": "address",
"type": "Address"
}
]
}
Run Code Online (Sandbox Code Playgroud)
顺便说一句,这允许您从单独的文件解析.
或者,您也可以以相同的方式解析引用模式的单个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"
}
]
}
]
Run Code Online (Sandbox Code Playgroud)
我想要一个与Confluent Inc.的Schema Registry一起使用的解决方案.
模式注册表不支持单独解析模式,但它确实支持解析为union类型的后一个示例.