给定GenericRecord,与对象相比,推荐的检索类型化值的方法是什么?我们是否应该强制转换值,如果是这样,从Avro类型到Java类型的映射是什么?例如,Avro Array == Java Collection ; 和Avro String == Java Utf8 。
由于每个GenericRecord都包含其架构,因此我希望找到一种类型安全的方法来检索值。
阿夫罗具有八个基本类型和5种复杂类型(不包括 工会 作为其它类型的组合)。下表13种这些阿夫罗类型映射到它们的输入接口(在Java类型可以是put成GenericRecord)和它们的输出实现(其通过返回的具体Java类型get从一个GenericRecord)。该值适用于Avro 1.7.7。
put
GenericRecord
get
╔═══════════╦════════════════════════╦═══════════════════════════╗ ║ Avro Type ║ Input Interface ║ Output Implementation ║ ╠═══════════╬════════════════════════╬═══════════════════════════╣ ║ null ║ ║ null ║ ║ boolean ║ java.lang.Boolean ║ java.lang.Boolean ║ ║ int ║ java.lang.Integer ║ java.lang.Integer ║ ║ long ║ java.lang.Long ║ java.lang.Long ║ ║ float ║ java.lang.Float ║ java.lang.Float ║ ║ double ║ java.lang.Double ║ java.lang.Double ║ ║ bytes ║ java.nio.ByteBuffer ║ java.nio.HeapByteBuffer ║ ║ string ║ java.lang.CharSequence ║ org.apache.avro.util.Utf8 ║ ║ record ║ *.GenericRecord ║ *.GenericData$Record ║ ║ enum ║ java.lang.CharSequence ║ *.GenericData$EnumSymbol ║ ║ array ║ java.util.Collection ║ *.GenericData$Array ║ ║ map ║ java.util.Map ║ java.util.HashMap ║ ║ fixed ║ *.GenericFixed ║ *.GenericData$Fixed ║ ╚═══════════╩════════════════════════╩═══════════════════════════╝ * == org.apache.avro.generic
╔═══════════╦════════════════════════╦═══════════════════════════╗ ║ Avro Type ║ Input Interface ║ Output Implementation ║ ╠═══════════╬════════════════════════╬═══════════════════════════╣ ║ null ║ ║ null ║ ║ boolean ║ java.lang.Boolean ║ java.lang.Boolean ║ ║ int ║ java.lang.Integer ║ java.lang.Integer ║ ║ long ║ java.lang.Long ║ java.lang.Long ║ ║ float ║ java.lang.Float ║ java.lang.Float ║ ║ double ║ java.lang.Double ║ java.lang.Double ║ ║ bytes ║ java.nio.ByteBuffer ║ java.nio.HeapByteBuffer ║ ║ string ║ java.lang.CharSequence ║ org.apache.avro.util.Utf8 ║ ║ record ║ *.GenericRecord ║ *.GenericData$Record ║ ║ enum ║ java.lang.CharSequence ║ *.GenericData$EnumSymbol ║ ║ array ║ java.util.Collection ║ *.GenericData$Array ║ ║ map ║ java.util.Map ║ java.util.HashMap ║ ║ fixed ║ *.GenericFixed ║ *.GenericData$Fixed ║ ╚═══════════╩════════════════════════╩═══════════════════════════╝
* == org.apache.avro.generic
在Avro 1.8.0中,enum类型需要一个GenericEnumSymbol。它不再接受CharSequence。
enum
GenericEnumSymbol
CharSequence