我正在编写一个简单的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对象字节相关联的架构。
答案 0 :(得分:1)
如documentation中所述,如果不提供架构,则无法解析数据。
[...] Avro数据本身未标记类型信息。架构 需要解析数据。
与protobuf不同,Avro不会在序列化数据中存储任何字段信息。这是一种无法规避的设计选择。
有很多关于专业和文章的文章。这种方法的缺点。 Martin Kleppmann撰写的Schema evolution in Avro, Protocol Buffers and Thrift是一本非常好的介绍,可以帮助我们了解事情的起作用以及它的含义。