我正在尝试使用Union数据类型支持的成员记录类型来构建AVRO的复杂记录。
{
"namespace": "proj.avro",
"protocol": "app_messages",
"doc" : "application messages",
"types": [
{
"name": "record_request",
"type" : "record",
"fields":
[
{
"name" : "request_id",
"type" : "int"
},
{
"name" : "message_type",
"type" : int,
},
{
"name" : "users",
"type" : "string"
}
]
},
{
"name" : "request_response",
"type" : "record",
"fields" :
[
{
"name" : "request_id",
"type" : "int"
},
{
"name" : "response_code",
"type" : "string"
},
{
"name" : "response_count",
"type" : "int"
},
{
"name" : "reason_code",
"type" : "string"
}
]
}
]
"messages" :
{
"published_msgs" :
{
"doc" : "My Messages",
"fields" :
[
{
"name" : "message_type",
"type" : "int"
},
{
"name" : "message_body",
"type" :
[
"reason_code", "request_response"
]
}
]
}
}
}
尝试读取这种模式时出现错误。
我想知道-是否可以声明这样的AVRO模式-它具有一个字段,该字段的类型是复杂的用户定义消息结构的联合。
如果可能的话,您能告诉我我在做错什么吗,还是用联合类型字段的类型定义举例说明这种结构?
我想使用AVRO的动态模式用法-因此,请指定此模式文件运行时,并将传入的缓冲区解析为“请求” /“响应”。
谢谢
答案 0 :(得分:1)
可以定义复杂类型的并集,您的模式的问题在于它不是在字段级别定义的。您的架构必须看起来像这样才能实现复杂类型的联合
{
"namespace": "proj.avro",
"protocol": "app_messages",
"doc" : "application messages",
"name": "myRecord",
"type" : "record",
"fields": [
{
"name": "requestResponse",
"type": [
{
"name": "record_request",
"type" : "record",
"fields":
[
{
"name" : "request_id",
"type" : "int"
},
{
"name" : "message_type",
"type" : "int"
},
{
"name" : "users",
"type" : "string"
}
]
},
{
"name" : "request_response",
"type" : "record",
"fields" :
[
{
"name" : "request_id",
"type" : "int"
},
{
"name" : "response_code",
"type" : "string"
},
{
"name" : "response_count",
"type" : "int"
},
{
"name" : "reason_code",
"type" : "string"
}
]
}
]
}
]
}