Ich versuche, Avro verwenden, um Schlüssel/Wert-Paare zu verschlüsseln, aber nicht herausfinden, wie nur ein einzelnes Feld in einem Schema/GenericData.Record zu kodieren, um die Schlüssel.Encoding GenericData.Record Feld separat als codierte Schlüssel
Nehmen Sie dieses einfache Schema:
{"name":"TestRecord", "type":"record", "fields":[
{"name":"id", "type":"long"},
{"name":"name", "type":"string"},
{"name":"desc", "default":null, "type":["null","string"]}
]}
Ich kodiert Aufzeichnungen wie folgt aus:
val testRecordSchema = schemaParser.parse(testRecordSchemaString)
val writer = new GenericDatumWriter[GenericRecord](testRecordSchema)
val baos = new ByteArrayOutputStream()
val encoder = EncoderFactory.get().binaryEncoder(baos, null)
val record = new org.apache.avro.generic.GenericData.Record(schema)
record.put("id", 1L)
record.put("name", "test")
writer.write(record, encoder)
encoder.flush
Aber jetzt sage ich separat nur die id
Feld, als Schlüssel zu verwenden, um codieren wollte, und Ich möchte es mit Namen machen, weil ich manchmal das Feld name
als Schlüssel anstelle der id
verwenden möchte.
Ich habe mehrere Permutationen von GenericDatumWriter
versucht. GenericDatumWriter
hat eine Methode namens writeField
, die vielversprechend aussieht, aber es ist protected
. Ansonsten sieht es so aus, als müssten Sie komplette Datensätze schreiben.
ich mein Feld in einem neuen Datensatz-Typ in einem neuen Schema, beispielsweise definiert wickeln könnte:
{"name":"TestRecordKey", "type":"record", "fields":[
{"name":"id", "type":"long"}
]}
ich 100% sicher bin ich, dass die Arbeit machen, aber dann muss ich eine neue erstellen Record-Typ und verwalten Sie es für jedes Schlüsselfeld. Das ist nicht unbedeutend, und es scheint wirklich so, als sollte es einen einfacheren Weg geben, dies zu tun.