Ich habe zwei Fragen:Avro Schemaevolution
Ist es möglich, den gleichen Leser zu verwenden und Aufzeichnungen analysieren, die mit zwei Schemas geschrieben wurden, die kompatibel sind, z.B.
Schema V2
hat nur ein zusätzliches optionales Feld im Vergleich zuSchema V1
und ich möchte, dass der Leser beides versteht? Ich denke, die Antwort hier ist nein, aber wenn ja, wie mache ich das?habe ich versucht, einen Datensatz mit
Schema V1
zu schreiben und es mitSchema V2
zu lesen, aber ich bekomme die folgende Fehlermeldung:org.apache.avro.AvroTypeException: Gefunden foo, erwartet foo
ich benutzte Avro-1.7.3 und:
writer = new GenericDatumWriter<GenericData.Record>(SchemaV1);
reader = new GenericDatumReader<GenericData.Record>(SchemaV2, SchemaV1);
Hier sind einige Beispiele der beiden Schemata (ich versucht habe auch einen Namespace hinzufügen, aber kein Glück).
Schema V1:
{
"name": "foo",
"type": "record",
"fields": [{
"name": "products",
"type": {
"type": "array",
"items": {
"name": "product",
"type": "record",
"fields": [{
"name": "a1",
"type": "string"
}, {
"name": "a2",
"type": {"type": "fixed", "name": "a3", "size": 1}
}, {
"name": "a4",
"type": "int"
}, {
"name": "a5",
"type": "int"
}]
}
}
}]
}
Schema V2:
{
"name": "foo",
"type": "record",
"fields": [{
"name": "products",
"type": {
"type": "array",
"items": {
"name": "product",
"type": "record",
"fields": [{
"name": "a1",
"type": "string"
}, {
"name": "a2",
"type": {"type": "fixed", "name": "a3", "size": 1}
}, {
"name": "a4",
"type": "int"
}, {
"name": "a5",
"type": "int"
}]
}
}
},
{
"name": "purchases",
"type": ["null",{
"type": "array",
"items": {
"name": "purchase",
"type": "record",
"fields": [{
"name": "a1",
"type": "int"
}, {
"name": "a2",
"type": "int"
}]
}
}]
}]
}
Vielen Dank im Voraus.
Standardwerte sind ein Muss, wenn Schemaevolution verwenden. Wenn Sie keinen Standardwert für ein Feld angeben, das im Leserschema, aber nicht im Writer-Schema vorhanden ist, kann Avro nicht herausfinden, wie dieses neue Feld in der analysierten Struktur erstellt wird. – LiMuBei