Avro SpecificRecord(即生成的Java类)是否与架构演进兼容? IE。如果我有Avro消息源(在我的情况下为kafka),并且想将这些消息反序列化为特定记录,是否可以安全地进行处理?

我所看到的:

  • 将字段添加到模式末尾的效果很好-可以反序列化确定到特定的记录
  • 在中间添加字段不会-即破坏现有客户端

  • 即使消息兼容,这也是一个问题。

    如果我可以找到新的架构(例如使用融合的架构注册表),则可以反序列化到GenericRecord,但是似乎没有一种方法可以从通用记录映射到不同架构的特定记录。
    MySpecificType message = (T SpecificData.get().deepCopy(MySpecificType.SCHEMA$, genericMessage);
    

    Deepcopy在很多地方都提到过,但是它使用索引,因此不起作用。

    当您具有两个架构并且它们兼容时,是否有任何安全的方法可以在两个Avro对象之间进行映射?即使我可以从genercrecord映射到genericrecord,也可以这样做,就像我可以做Deepcopy技巧来完成这项工作一样。

    最佳答案

    这里有针对特定数据类型转换的示例测试。所有这些都在配置“specificDeserializerProps”中

    https://github.com/confluentinc/schema-registry/blob/master/avro-serializer/src/test/java/io/confluent/kafka/serializers/KafkaAvroSerializerTest.java

    我添加了以下配置,并根据需要获取了特定类型。

    HashMap<String, String> specificDeserializerProps = new HashMap<String, String>();
    specificDeserializerProps.put(KafkaAvroDeserializerConfig.SCHEMA_REGISTRY_URL_CONFIG, "bogus");
    specificDeserializerProps.put(KafkaAvroDeserializerConfig.SPECIFIC_AVRO_READER_CONFIG, "true");
    specificAvroDeserializer = new KafkaAvroDeserializer(schemaRegistry, specificDeserializerProps);
    

    希望能有所帮助

    关于java - 如何在Avro中将GenericRecord转换为SpecificRecord以获取兼容模式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33945383/

    10-14 08:02