从Avro GenericRecord获取输入值
给定GenericRecord ,与Object相反,检索类型值的推荐方法是什么? 我们是否期望投射这些值,如果是这样,从Avro类型到Java类型的映射是什么? 例如,Avro Array == Java Collection ; 和Avro String == Java Utf8 。
由于每个GenericRecord都包含其架构,我希望以类型安全的方式检索值。
Avro有八种原始类型和五种复杂类型(不包括其他类型组合的联合)。 下表将这13种Avro类型映射到它们的输入接口(可以put
GenericRecord
的Java类型)及其输出实现(由GenericRecord
get
的具体Java类型)。 这些值适用于Avro 1.7.7。
╔═══════════╦════════════════════════╦═══════════════════════════╗ ║ 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 ║ ╚═══════════╩════════════════════════╩═══════════════════════════╝
╔═══════════╦════════════════════════╦═══════════════════════════╗ ║ 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
。
Avro中的GenericRecords不会为您提供类型安全的方式,因为它在运行时都已计算出来。 您可以添加有用的包装器,但在一天结束时,您的代码需要隐式知道它的工作原理。
如果您想要一种类型安全的方法,您需要使用序列化到Java SpecificRecord类,该类可以使用Avro maven插件生成。