如何让 Avro SchemaBuilder 构建两个 'records' 之间的映射模式?
How can I get Avro SchemaBuilder to build a schema of a map between two 'records'?
正在尝试序列化 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()
。
Apache Avro Unions 在这里可以提供帮助。
SchemaBuilder.builder()
.map()
.values(SchemaBuilder.unionOf().type(firstSchema).and().type(secondSchema).endUnion());
其中 firstSchema
和 secondSchema
是已经为所需的用户和用户密钥定义的单独模式 'records'(考虑问题中的模式)
正在尝试序列化 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()
。
Apache Avro Unions 在这里可以提供帮助。
SchemaBuilder.builder()
.map()
.values(SchemaBuilder.unionOf().type(firstSchema).and().type(secondSchema).endUnion());
其中 firstSchema
和 secondSchema
是已经为所需的用户和用户密钥定义的单独模式 'records'(考虑问题中的模式)