2016-05-01 18 views
0

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%確信しているが、その後、私は新しいを作成する必要がありますキーフィールドごとに管理します。これはマイナーなことではないし、これを行うもっと簡単な方法があるように思える。

答えて

0

結局のところ、それだけで1つのフィールドだけを持つ新しいレコードタイプのスキーマを作成することは難しくありませんでした - 私はキーとして使用するフィールド、私は上記の持っている例のように:

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

ペイロードスキーマを使用してSchema.Parserを初期化するので、私はそれを実行します。ペイロードスキーマに基づいてキースキーマをプログラムで作成するだけです。

これまでの解決策は望めませんでしたが、これは機能します。私はまだupvoteとクリーンな任意のソリューションを受け入れるよ。

関連する問題