java - 从 Avro GenericRecord 获取类型值

标签 java avro

给定一个 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/

相关文章:

Java:将 HashMap 添加到 Talend 的 ArrayList

Scala 反射和类型标签不匹配

apache-kafka - Confluent Cloud 中的消息值未正确解码

apache-kafka - 使用 Avro + Schema Registry 时如何从模式定义中受益来序列化/反序列化消息?

java - SpringMVC、null spring beans、servlet 和 Apache Thrift

java - 用java读取输入文件

java - 什么时候像这样在 Java 中使用大括号 block ?

java - Rhino 在 Java 中评估 javascript 对象

java - Avro 在消费者端通过 kafka 自定义解码 UUID

java - 使用 Mapreduce 在 hadoop 中将文本文件转换为 Avrofile