将 Avro 反序列化为地图
Deserialize Avro to Map
有人知道使用 Pojo 和 [=] Avro without 28=]架构?
问题:
我有不同 Avro 文件的数据流。
目标是根据某些属性(例如 user.role
、another.really.deep.attribute.with.specific.value
等)的存在对数据进行分组。
每个 avro 条目可能包含任意数量的匹配属性 - 从零到所有列出的)。
因此,无需对数据进行任何操作。只是为了偷看一些元素。
问题是,有什么方法可以将这些数据转换为 Map 或 Node 吗?就像我可以用 JSON 使用 Jackson 或 GSON 来做到这一点。
我试过使用 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 数据的编码方式)
有人知道使用 Pojo 和 [=] Avro without 28=]架构?
问题:
我有不同 Avro 文件的数据流。
目标是根据某些属性(例如 user.role
、another.really.deep.attribute.with.specific.value
等)的存在对数据进行分组。
每个 avro 条目可能包含任意数量的匹配属性 - 从零到所有列出的)。
因此,无需对数据进行任何操作。只是为了偷看一些元素。
问题是,有什么方法可以将这些数据转换为 Map 或 Node 吗?就像我可以用 JSON 使用 Jackson 或 GSON 来做到这一点。
我试过使用 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 数据的编码方式)