将 Avro 反序列化为地图

Deserialize Avro to Map

有人知道使用 Pojo 和 [=] Avro without 28=]架构?

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

因此,无需对数据进行任何操作。只是为了偷看一些元素。

问题是,有什么方法可以将这些数据转换为 Map 或 Node 吗?就像我可以用 JSON 使用 Jackson 或 GS​​ON 来做到这一点。

我试过使用 GenericDatumReader,但它需要 Schema。所以也许我只需要从 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());
    }
}

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

反序列化任何消息都需要 reader 架构

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

如果没有这些选项,那么您将需要自己找出架构(可能使用 hexdump 并了解 Avro 数据的编码方式)