从 Avro GenericRecord 获取类型值
Get a typed value from an Avro GenericRecord
给定 GenericRecord, what is the recommended way to retrieve a typed value, as opposed to an Object? Are we expected to cast the values, and if so what is the mapping from Avro types to Java types? For example, Avro Array == Java Collection; and Avro String == Java Utf8.
由于每个 GenericRecord 都包含其模式,我希望有一种类型安全的方法来检索值。
Avro 中的 GenericRecords 不会为您提供类型安全的方法,因为它都是在运行时计算出来的。您可以添加有用的包装器,但最终您的代码需要隐式地知道它正在使用什么。
如果你想要一种类型安全的方式,你需要使用序列化到一个 Java SpecificRecord class 中,它可以用 Avro maven 插件生成。
Avro 有八种原始类型和五种复杂类型(不包括 unions,它们是其他类型的组合)。以下 table 将这 13 种 Avro 类型映射到它们的输入接口(Java 类型可以 put
到 GenericRecord
)及其输出实现(具体 Java 类型由 get
从 GenericRecord
返回)。这些值适用于 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 ║
╚═══════════╩════════════════════════╩═══════════════════════════╝
* == org.apache.avro.generic
在 Avro 1.8.0 中,enum
类型 requires a GenericEnumSymbol
。它不再接受 CharSequence
.
给定 GenericRecord, what is the recommended way to retrieve a typed value, as opposed to an Object? Are we expected to cast the values, and if so what is the mapping from Avro types to Java types? For example, Avro Array == Java Collection; and Avro String == Java Utf8.
由于每个 GenericRecord 都包含其模式,我希望有一种类型安全的方法来检索值。
Avro 中的 GenericRecords 不会为您提供类型安全的方法,因为它都是在运行时计算出来的。您可以添加有用的包装器,但最终您的代码需要隐式地知道它正在使用什么。
如果你想要一种类型安全的方式,你需要使用序列化到一个 Java SpecificRecord class 中,它可以用 Avro maven 插件生成。
Avro 有八种原始类型和五种复杂类型(不包括 unions,它们是其他类型的组合)。以下 table 将这 13 种 Avro 类型映射到它们的输入接口(Java 类型可以 put
到 GenericRecord
)及其输出实现(具体 Java 类型由 get
从 GenericRecord
返回)。这些值适用于 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 ║
╚═══════════╩════════════════════════╩═══════════════════════════╝
* == org.apache.avro.generic
在 Avro 1.8.0 中,enum
类型 requires a GenericEnumSymbol
。它不再接受 CharSequence
.