我正在尝试使用联合数据类型支持的成员记录类型来构建 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" :
                    [
                        "record_request", "request_response"
                    ]
                }
            ]

        }
    }
}
尝试读取这种模式时出现错误。
我想知道 - 是否可以声明这样的 AVRO 模式 - 它具有类型是复杂用户定义消息结构联合的字段之一。
如果可能,那么您能否让我知道我做错了什么或具有联合类型字段类型定义的此类结构的示例?
我想使用 AVRO 的动态模式用法 - 因此指定此模式文件运行时并将传入缓冲区解析为“请求”/“响应”。
谢谢,

最佳答案

可以定义复杂类型的联合,您的架构的问题在于它没有在字段级别定义。您的架构必须看起来像这样才能实现复杂类型的联合

{
    "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"
                }
            ]
        }
    ]
    }
    ]
}

关于java - AVRO - 具有联合记录类型支持的复杂记录,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51031364/

10-11 20:40
查看更多