首页 > 解决方案 > 如何让 Avro SchemaBuilder 在两个“记录”之间构建映射模式?

问题描述

尝试序列化表示为 Map 的 Java 对象。这需要我先构建一个 Avro Schema。我正在使用 Avro SchemaBuilder生成模式。已经成功地为 Map 的对象生成模式。但是无法处理整个地图的架构构建。最终架构应如下所示(手动创建此架构):

{
    "type": "record",
    "name": "MapObject",
    "namespace": "test",
    "fields": [
        {
            "name": "CacheMap",
            "type": {
                "type": "map",
                "values": [
                    {
                        "type": "record",
                        "name": "User",
                        "namespace": "test",
                        "fields": [                         
                            {
                                "name": "id",
                                "type": "long"
                            },
                            {
                                "name": "status",
                                "type": "string"
                            }
                        ]
                    },
                    {
                        "type": "record",
                        "name": "UserKey",
                        "namespace": "test",
                        "fields": [
                            {
                                "name": "key",
                                "type": "long"
                            },
                            {
                                "name": "keyPrint",
                                "type": "string"
                            }
                        ]
                    }
                ]
            }
        }
    ]
}

如何在 SchemaBuilder 中将映射的键和值传递给不同的记录? SchemaBuilder.map().values()不允许将多个 Schema 作为参数传递给.value().

标签: javaavro

解决方案


Apache Avro Unions可以在这里提供帮助。

SchemaBuilder.builder()
            .map()
 .values(SchemaBuilder.unionOf().type(firstSchema).and().type(secondSchema).endUnion());

其中 thefirstSchema和 thesecondSchema是已经为所需的 User 和 UserKey 'records' 定义的单独模式(考虑问题中的模式)


推荐阅读