给定一个 GenericRecord ,与对象相反,检索类型化值的推荐方法是什么?我们是否期望转换这些值,如果是,来自 Avro types 的映射是什么?到 Java 类型?例如,Avro Array == Java Collection;和 Avro String == Java Utf8 .
由于每个 GenericRecord 都包含其模式,我希望有一种类型安全的方法来检索值。
最佳答案
Avro 有八种基本类型和五种复杂类型(不包括 unions,它是其他类型的组合)。下表将这 13 种 Avro 类型映射到它们的输入接口(interface)(可以放入
到 GenericRecord
中的 Java 类型)及其输出实现(返回的具体 Java 类型通过 GenericRecord
中的 get
)。这些值适用于 Avro 1.7.7。
╔═══════════╦════════════════════════╦════════════ ═══════════════╗
║ Avro 类型 ║ 输入接口(interface) ║ 输出实现 ║
╠═══════════╬════════════════════════╬════════════ ═══════════════╣
║ 无效 ║ ║ 无效 ║
║ boolean 值 ║ java.lang.Boolean ║ java.lang.Boolean ║
║ 整数 ║ java.lang.Integer ║ java.lang.Integer ║
║ 长 ║ java.lang.Long ║ java.lang.Long ║
║ float ║ java.lang.Float ║ java.lang.Float ║
║ 双 ║ java.lang.Double ║ java.lang.Double ║
║ 字节 ║ java.nio.ByteBuffer ║ java.nio.HeapByteBuffer ║
║ 字符串 ║ java.lang.CharSequence ║ org.apache.avro.util.Utf8 ║
║ 记录 ║ *.GenericRecord ║ *.GenericData$Record ║
║ 枚举 ║ java.lang.CharSequence ║ *.GenericData$EnumSymbol ║
║ 数组 ║ java.util.Collection ║ *.GenericData$Array ║
║ 映射 ║ java.util.Map ║ java.util.HashMap ║
║ 固定 ║ *.GenericFixed ║ *.GenericData$Fixed ║
╚═══════════╩════════════════════════╩════════════ ═══════════════╝
* == org.apache.avro.generic
在 Avro 1.8.0 中,enum
类型 requires一个 GenericEnumSymbol
。它不再接受 CharSequence
。
关于java - 从 Avro GenericRecord 获取类型值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34070028/