有人知道如何在不使用任何 Pojo 和 Schemas 的情况下反序列化 Avro ?
问题:
我有一个不同 Avro 文件的数据流。
目标是根据某些属性(例如 user.role
、another.really.deep.attribute.with.specific.value
等)的存在对数据进行分组。
每个 avro 条目可能包含任意数量的匹配属性 - 从零到列出的所有属性)。
所以,不需要对数据做任何事情。只是为了看看一些元素。
问题是,有没有办法将数据转换为 Map 或 Node?就像我可以使用 Jackson 或 GSON 用 JSON 来完成。
我尝试使用 GenericDatumReader
,但它需要一个 架构。所以也许我所需要的只是从 avro 读取模式(如何?)。
另外,我尝试使用类似的方法,但这种方法不起作用。
public Map deserialize(byte[] data) {
DatumReader<LinkedHashMap> reader
= new SpecificDatumReader<>(LinkedHashMap.class);
Decoder decoder = null;
try {
decoder = DecoderFactory.get().binaryDecoder(data, null);
return reader.read(null, decoder);
} catch (IOException e) {
logger.error("Deserialization error:" + e.getMessage());
}
}
因为我有时间“玩”这个问题,所以我创建了一个实用程序类,它根据键生成模式。它有效,但看起来开销很大。
答案 0 :(得分:1)
需要阅读器架构来反序列化任何消息。
如果您有可用的 writer 架构,您可以简单地使用它。请注意,如果您有 Avro 文件,则这些文件包含编写它们时使用的架构,您可以使用 avro-tools.jar -getschema
提取它
如果没有这些选项,那么您需要自己找出架构(可能使用十六进制转储并了解 Avro 数据是如何编码的)