Apache Avro:map使用CharSequence作为密钥

Mel*_*lon 9 java avro

我正在使用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.

它使用起来非常不方便CharSequenceMap关键,是有办法来生成String类型键MapApache的Avro的

PS

问题是,例如,即使存在这样的密钥,dataMap.containsKey("SOME_KEY")也会返回false,因为它是CharSequence.此外,使用现有密钥放置一个映射条目不会重新使用旧密钥.这就是为什么我说用它CharSequence作为关键是不方便的.

Ale*_* A. 8

这次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)


Ste*_*n C 6

显然,Avro 1.6中存在解决此问题的方法.您在项目的POM文件中指定字符串类型:

  <stringType>String</stringType>
Run Code Online (Sandbox Code Playgroud)

本期中提到的是AVRO-803 ......虽然插件的Web文档没有反映出这一点.


Cha*_*the 5

显然,默认情况下,Avro 使用CharSequence. 我找到了一种方法来配置它以转换为String

从 Avro 1.6.0 开始,有一个选项可以让 Avro 始终执行到字符串的转换。有几种方法可以实现这一点。第一个是将架构中的 avro.java.string 属性设置为 String:

         { "type": "string", "avro.java.string": "String" }
Run Code Online (Sandbox Code Playgroud)

我没有测试过这个。

  • 这是每个字段的配置吗?你如何为地图键做到这一点?另外,链接已失效。 (2认同)

chr*_*ke- 4

无论是否可以强制 Avro 使用 a StringCharSequence直接使用都是一个糟糕的实现,因为CharSequence它不是Comparable<CharSequence>,甚至没有指定两个相同序列的相等性。我建议将此作为针对 Avro 的错误提交。