将 Avro 反序列化为 Map

时间:2021-05-17 20:06:02

标签: java avro

有人知道如何在不使用任何 PojoSchemas 的情况下反序列化 Avro

问题: 我有一个不同 Avro 文件的数据流。 目标是根据某些属性(例如 user.roleanother.really.deep.attribute.with.specific.value 等)的存在对数据进行分组。 每个 avro 条目可能包含任意数量的匹配属性 - 从零到列出的所有属性)。

所以,不需要对数据做任何事情。只是为了看看一些元素。

问题是,有没有办法将数据转换为 Map 或 Node?就像我可以使用 Jackson 或 GS​​ON 用 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());
    }
}

因为我有时间“玩”这个问题,所以我创建了一个实用程序类,它根据键生成模式。它有效,但看起来开销很大。

1 个答案:

答案 0 :(得分:1)

需要阅读器架构来反序列化任何消息。

如果您有可用的 writer 架构,您可以简单地使用它。请注意,如果您有 Avro 文件,则这些文件包含编写它们时使用的架构,您可以使用 avro-tools.jar -getschema 提取它

如果没有这些选项,那么您需要自己找出架构(可能使用十六进制转储并了解 Avro 数据是如何编码的)