我正在使用Apache Avro.
我的架构有地图类型:
{"name": "MyData",
"type" : {"type": "map",
"values":{
"type": "record",
"name": "Person",
"fields":[
{"name": "name", "type": "string"},
{"name": "age", "type": "int"},
]
}
}
}
Run Code Online (Sandbox Code Playgroud)
编译模式,在genated Java类使用后CharSequence为关键 的Map MyData.
它使用起来非常不方便CharSequence的Map关键,是有办法来生成String类型键Map在Apache的Avro的?
PS
问题是,例如,即使存在这样的密钥,dataMap.containsKey("SOME_KEY")也会返回false,因为它是CharSequence.此外,使用现有密钥放置一个映射条目不会重新使用旧密钥.这就是为什么我说用它CharSequence作为关键是不方便的.
这次JIRA讨论是相关的.仍然使用CharSequence的要点是向后兼容性.
就像Charles Forsythe所指出的那样,通过在模式中设置字符串属性,已经为必要时添加了一个变通方法.
{ "type": "string", "avro.java.string": "String" }
Run Code Online (Sandbox Code Playgroud)
这里的默认类型是他们自己的Utf8类.除了手动规范和pom.xml设置之外,还有一个avro-tools编译选项,-string选项:
java -jar avro-tools.1.7.5.jar compile -string schema /path/to/schema .
Run Code Online (Sandbox Code Playgroud)
显然,Avro 1.6中存在解决此问题的方法.您在项目的POM文件中指定字符串类型:
<stringType>String</stringType>
Run Code Online (Sandbox Code Playgroud)
本期中提到的是AVRO-803 ......虽然插件的Web文档没有反映出这一点.
显然,默认情况下,Avro 使用CharSequence. 我找到了一种方法来配置它以转换为String
从 Avro 1.6.0 开始,有一个选项可以让 Avro 始终执行到字符串的转换。有几种方法可以实现这一点。第一个是将架构中的 avro.java.string 属性设置为 String:
{ "type": "string", "avro.java.string": "String" }
Run Code Online (Sandbox Code Playgroud)
我没有测试过这个。
无论是否可以强制 Avro 使用 a String,CharSequence直接使用都是一个糟糕的实现,因为CharSequence它不是Comparable<CharSequence>,甚至没有指定两个相同序列的相等性。我建议将此作为针对 Avro 的错误提交。