2016-05-01 5 views
0

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.

Antwort

0

Wie sich herausstellt, ist es nicht so schwierig war einfach mit nur einem Feld einen neuen Datensatz-Typ Schema zu erstellen - das Feld I als Schlüssel verwenden möchten, wie das Beispiel habe ich oben:

{"name":"TestRecordKey", "type":"record", "fields":[ 
    {"name":"id", "type":"long"} 
]} 

Ich mache es im laufenden Betrieb, wie ich meine Schema.Parser mit den Nutzlastschemas initialisieren - ich nur das Schlüsselschema basierend auf dem Nutzlastschema programmgesteuert erstellen.

Hoffte auf eine weniger lang-hand Lösung, aber das funktioniert. Ich werde immer noch upvote und akzeptiere jede Lösung, die sauberer ist.