是否可以在Avro的地图中使用非字符串作为键?
我发现了这个问题AVRO-680,该问题声称已添加了非字符串键支持,但是我找不到任何示例,也无法从补丁中弄清楚新支持如何与模式一起使用。
我想做这样的事情:
"name": "aThing",
"type": "record",
"fields": [
{ "name": "aMapOfThings", "type": {
"type": "map", "keys": "MyKeyType", "values": "MyValueType"
}
}
]
或在
avdl
中: record aThing {
map<MyKeyType, MyValueType> aMapOfThings = [:];
}
就像这样的protobuf问题:Protobuf objects as Keys in Maps
最佳答案
从PR来看,该增强功能实际上并不是为与SpecificRecord
一起使用而设计的。看起来代码更改和测试集中在GenericRecord
上,并且通过包含一个带有非字符串键的map的Java类的反射来得出模式信息。
以下是从POJO派生的模式的示例,该POJO的Map包含非字符串键(来自TestNonStringMapKeys.java)。请注意,它是一个记录数组,而不是map
类型:
{
"type" : "record",
"name" : "Company",
"namespace" : "org.apache.avro.reflect",
"fields" : [ {
"name" : "employees",
"type" : [ "null", {
"type" : "array",
"items" : {
"type" : "record",
"name" : "Pair487429dd20c65898",
"fields" : [ {
"name" : "key",
"type" : {
"type" : "record",
"name" : "EmployeeId",
"fields" : [ {
"name" : "id",
"type" : [ "null", "int" ],
"default" : null
} ]
}
}, {
"name" : "value",
"type" : {
"type" : "record",
"name" : "EmployeeInfo",
"fields" : [ {
"name" : "name",
"type" : [ "null", "string" ],
"default" : null
} ]
}
} ]
},
"java-class" : "java.util.HashMap"
} ],
"default" : null
} ]
}