转储没有模式的 Avro 字节
Dump Avro bytes without schema
我正在编写一个简单的 Java 工具来在控制台上转储 kafka 主题的内容。 Kafka 记录的值恰好是一个 Avro 对象。我希望能够以某种人类可读的格式转储 Avro 数据。我想知道是否有一种方法可以将一个 Avro 对象(我有一个字节数组)的内容打印成某种人类可读的格式?
KafkaConsumer<String, byte[]> kafkaConsumer = createConsumer(); //Create a consumer with my config
ConsumerRecords<String, byte[]> records = kafkaConsumer.poll(200);
for (ConsumerRecord<String, byte[]> record : records) {
byte[] myAvroDataAsBytes = record.value();
//TODO: How do I print these bytes without knowing the schema?
}
在上面的代码片段中,我正在寻找一种方法来打印 myAvroDataAsBytes 的内容,而无需了解与 Avro 对象字节关联的模式。
如 documentation 中所述,不提供模式就无法解析数据。
[...] Avro data itself is not tagged with type information. The schema
is required to parse data.
与protobuf不同,Avro在序列化数据中不存储任何字段信息。这是一个无法规避的设计选择。
关于这种方法的优缺点的文章很多。 Schema evolution in Avro, Protocol Buffers and Thrift 作者 Martin Kleppmann 是一个很好的介绍,可以帮助您了解事物的幕后工作原理及其含义。
我正在编写一个简单的 Java 工具来在控制台上转储 kafka 主题的内容。 Kafka 记录的值恰好是一个 Avro 对象。我希望能够以某种人类可读的格式转储 Avro 数据。我想知道是否有一种方法可以将一个 Avro 对象(我有一个字节数组)的内容打印成某种人类可读的格式?
KafkaConsumer<String, byte[]> kafkaConsumer = createConsumer(); //Create a consumer with my config
ConsumerRecords<String, byte[]> records = kafkaConsumer.poll(200);
for (ConsumerRecord<String, byte[]> record : records) {
byte[] myAvroDataAsBytes = record.value();
//TODO: How do I print these bytes without knowing the schema?
}
在上面的代码片段中,我正在寻找一种方法来打印 myAvroDataAsBytes 的内容,而无需了解与 Avro 对象字节关联的模式。
如 documentation 中所述,不提供模式就无法解析数据。
[...] Avro data itself is not tagged with type information. The schema is required to parse data.
与protobuf不同,Avro在序列化数据中不存储任何字段信息。这是一个无法规避的设计选择。
关于这种方法的优缺点的文章很多。 Schema evolution in Avro, Protocol Buffers and Thrift 作者 Martin Kleppmann 是一个很好的介绍,可以帮助您了解事物的幕后工作原理及其含义。