Avroを使用してキー/値のペアをエンコードしようとしていますが、スキーマ/ GenericData.Recordの1つのフィールドをエンコードする方法を理解できませんキー。符号化されたキーとしてGenericData.Recordフィールドを別々に符号化します
このシンプルなスキーマください:
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
しかし、今は、私がキーとして使用するために、ちょうどid
フィールド個別にエンコードしたいと言う、そして:
{"name":"TestRecord", "type":"record", "fields":[
{"name":"id", "type":"long"},
{"name":"name", "type":"string"},
{"name":"desc", "default":null, "type":["null","string"]}
]}
を私はこのような記録をコードしています私は時々name
フィールドをid
の代わりにキーとして使用したいので名前でやりたいと思います。
GenericDatumWriter
の複数の置換を試みました。 GenericDatumWriter
には、writeField
という有望な方法がありますが、protected
です。それ以外の場合は、完全なレコードを書き込む必要があります。
私は、たとえば、新しいスキーマで定義された新しいレコードタイプで私のフィールドをラップすることができます:
{"name":"TestRecordKey", "type":"record", "fields":[
{"name":"id", "type":"long"}
]}
を私はその仕事をすることができ、100%確信しているが、その後、私は新しいを作成する必要がありますキーフィールドごとに管理します。これはマイナーなことではないし、これを行うもっと簡単な方法があるように思える。