【发布时间】:2015-01-12 23:42:21
【问题描述】:
我有一个像这样的 Avro Schema -
{
"type":"record",
"name":"new_user",
"namespace":"com.hello",
"fields":[
{
"name":"user_id",
"type":[
"long",
"null"
]
},
{
"name":"segment",
"type":[
"string",
"null"
]
}
]
}
我正在使用我上面的 Avro Schema 来序列化数据,这给了我一个字节数组并且工作正常 -
public static void main(String[] args) throws IOException {
Schema schema = new Parser()
.parse("{ \"type\":\"record\", \"name\":\"new_user\", \"namespace\":\"com.hello\", \"fields\":[ { \"name\":\"user_id\", \"type\":[ \"long\", \"null\" ] }, { \"name\":\"segment\", \"type\":[ \"string\", \"null\" ] } ] }");
byte[] originalAvrodata = getAvroBinaryData(schema);
// how to get newAvroData byte array in which user_id
// is change to some other random long number?
}
private static byte[] getAvroBinaryData(Schema schema) throws IOException {
GenericRecord record = new GenericData.Record(schema);
record.put("user_id", 123456L);
record.put("segment", "hello");
GenericDatumWriter<GenericRecord> writer = new GenericDatumWriter<GenericRecord>(schema);
ByteArrayOutputStream os = new ByteArrayOutputStream();
Encoder e = EncoderFactory.get().binaryEncoder(os, null);
writer.write(record, e);
e.flush();
byte[] byteData = os.toByteArray();
return byteData;
}
问题陈述:
我需要解码originalAvrodata 字节数组,然后将user_id 字段值更改为其他long 数字,然后使用应该具有user_id 字段值的相同架构构造一个newAvroData 字节数组到一些随机的long 号码。使用 Avro 是否有可能做到这一点?
【问题讨论】: