从Avro GenericRecord获取输入值

时间:2015-12-03 15:37:41

标签: java avro

给定GenericRecord,检索类型化值的推荐方法是什么,而不是Object?我们是否希望转换值,如果是,那么从Avro types到Java类型的映射是什么?例如,Avro Array == Java Collection ;和Avro String == Java Utf8

由于每个GenericRecord都包含其架构,我希望有一种类型安全的方法来检索值。

2 个答案:

答案 0 :(得分:12)

Avro有八种基本类型和五种复杂类型(不包括联合,它们是其他类型的组合)。下表将这13种Avro类型映射到它们的输入接口(可以是putGenericRecord的Java类型)及其输出实现(由{{1}返回的具体Java类型来自get)。这些值适用于Avro 1.7.7。

GenericRecord ╔═══════════╦════════════════════════╦═══════════════════════════╗ ║ 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 1.8.0中,* == org.apache.avro.generic类型requires一个enum。它不再接受GenericEnumSymbol

答案 1 :(得分:2)

Avro中的GenericRecords不会为您提供类型安全的方式,因为它在运行时都已计算出来。您可以添加有用的包装器,但在一天结束时,您的代码需要隐式知道它的工作原理。

如果您想要一种类型安全的方法,您需要使用序列化到Java SpecificRecord类,该类可以使用Avro maven插件生成。