2015-11-26 7 views
6

Ist Avro SpecificRecord (d. H. Die generierten Java-Klassen) mit der Schema-Evolution kompatibel? I.e. Wenn ich eine Quelle von Avro-Nachrichten habe (in meinem Fall kafka) und ich diese Nachrichten zu einem bestimmten Datensatz deserialisieren möchte, ist es möglich, dies sicher zu tun?Konvertieren von GenericRecord zu SpecificRecord in Avro für kompatible Schemas

Was ich sehe:

  • ein Feld an das Ende eines Schemas Hinzufügen funktioniert gut - kann ok deserialisieren
  • Hinzufügen eines Feldes in die Mitte specificrecord nicht - dh Pausen bestehenden Kunden

Auch wenn die Nachrichten kompatibel sind, ist dies ein Problem.

Wenn ich das neue Schema finden (zB mit konfluenten Schema Registry) Ich kann GenericRecord deserialisieren, aber es scheint nicht, ein Weg, um von genericrecord zu specificrecord verschiedenem Schema abzuzubilden ..

MySpecificType message = (T SpecificData.get().deepCopy(MySpecificType.SCHEMA$, genericMessage); 

Deepcopy wird an verschiedenen Stellen erwähnt, aber es verwendet Index, so funktioniert nicht ..

Gibt es eine sichere Möglichkeit, zwischen zwei AVRO-Objekte zuordnen, wenn Sie beide Schemas haben und sie kompatibel sind? Selbst wenn ich von genercrecord zu genericrecord mappen könnte, würde dies tun, was ich tun könnte, um den Job abzuschließen.

+2

Haben Sie jemals herauszufinden hilft, wie dies zu tun? Ich bin auf das gleiche Problem fest, immer wieder eine "org.apache.avro.generic.GenericData $ Record kann nicht in org.apache.avro.specific.SpecificRecord umgewandelt werden" Fehler ... – Matt

+1

Ich verwendete eine AutoMapper-Klasse, die zugeordnet basierend auf dem Feldnamen. Eine Beispielimplementierung ist hier: https://gist.github.com/markdav/01623363b5b2508b8e5ef6146caedb1b –

Antwort

2

Hier finden Sie Beispieltests für die Konvertierung bestimmter Datentypen. Seine alle in der Konfiguration ‚specificDeserializerProps‘

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

Ich habe die folgende Konfiguration und bekam den spezifischen Typ als wollte aus.

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); 

Hoffnung, die

+0

Dieser Deserializer ist neu .. Ich werde es versuchen! –