将 GenericData.Record 字段单独编码为编码密钥
Encode GenericData.Record field separately as encoded key
我正在尝试使用 Avro 对键/值对进行编码,但无法弄清楚如何仅对模式中的单个字段进行编码/GenericData.Record 以生成键。
采用这个简单的架构:
{"name":"TestRecord", "type":"record", "fields":[
{"name":"id", "type":"long"},
{"name":"name", "type":"string"},
{"name":"desc", "default":null, "type":["null","string"]}
]}
我正在这样编码记录:
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
字段用作键而不是 id
.
我尝试了 GenericDatumWriter
的多种排列。 GenericDatumWriter
有一个名为 writeField
的方法看起来很有前途,但它是 protected
。不然好像得写完整的记录。
我可以将我的字段包装在新架构中定义的新记录类型中,例如:
{"name":"TestRecordKey", "type":"record", "fields":[
{"name":"id", "type":"long"}
]}
我 100% 确定我可以做到这一点,但是我必须创建一个新的记录类型并为每个关键字段管理它。这不是次要的,看起来确实应该有一些更简单的方法来做到这一点。
事实证明,创建一个只有一个字段的新记录类型模式并不难——我想用作键的字段,就像我上面的例子:
{"name":"TestRecordKey", "type":"record", "fields":[
{"name":"id", "type":"long"}
]}
我在使用有效负载模式初始化 Schema.Parser
时即时执行此操作——我只是以编程方式基于有效负载模式创建密钥模式。
希望有一个不那么长手的解决方案,但这行得通。我仍然会投票并接受任何更清洁的解决方案。
我正在尝试使用 Avro 对键/值对进行编码,但无法弄清楚如何仅对模式中的单个字段进行编码/GenericData.Record 以生成键。
采用这个简单的架构:
{"name":"TestRecord", "type":"record", "fields":[
{"name":"id", "type":"long"},
{"name":"name", "type":"string"},
{"name":"desc", "default":null, "type":["null","string"]}
]}
我正在这样编码记录:
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
字段用作键而不是 id
.
我尝试了 GenericDatumWriter
的多种排列。 GenericDatumWriter
有一个名为 writeField
的方法看起来很有前途,但它是 protected
。不然好像得写完整的记录。
我可以将我的字段包装在新架构中定义的新记录类型中,例如:
{"name":"TestRecordKey", "type":"record", "fields":[
{"name":"id", "type":"long"}
]}
我 100% 确定我可以做到这一点,但是我必须创建一个新的记录类型并为每个关键字段管理它。这不是次要的,看起来确实应该有一些更简单的方法来做到这一点。
事实证明,创建一个只有一个字段的新记录类型模式并不难——我想用作键的字段,就像我上面的例子:
{"name":"TestRecordKey", "type":"record", "fields":[
{"name":"id", "type":"long"}
]}
我在使用有效负载模式初始化 Schema.Parser
时即时执行此操作——我只是以编程方式基于有效负载模式创建密钥模式。
希望有一个不那么长手的解决方案,但这行得通。我仍然会投票并接受任何更清洁的解决方案。