我有一个POJO需要发送到另一个端点(某个服务器)。 我决定使用avro。
到目前为止,我已经创建了我的Avro架构并生成了我的DataFileWriter:
GenericRecord user1 = new GenericData.Record(schema);
user1.put("name", "Jenny");
user1.put("favorite_color", "green");
GenericRecord user2 = new GenericData.Record(schema);
user2.put("name", "Kevin");
user2.put("favorite_color", "red");
DatumWriter<GenericRecord> datumWriter = new GenericDatumWriter<GenericRecord>(schema);
DataFileWriter<GenericRecord> dataFileWriter = new DataFileWriter<GenericRecord>(datumWriter);
dataFileWriter.create(schema, schemaFile);
dataFileWriter.append(user1);
dataFileWriter.append(user2);
这是我到目前为止所缺少的内容:
我想在发送之前压缩数据,我宁愿使用snappy来做,我应该如何将它与我的代码结合使用?
更新 添加了这些行:
// use snappy compression
CodecFactory codecFactory = CodecFactory.snappyCodec();
dataFileWriter.setCodec(codecFactory);
但我不确定它是否能胜任。
答案 0 :(得分:1)
使用此:
public byte[] serialize(T objectToSerialize) {
ByteArrayOutputStream out = new ByteArrayOutputStream();
DatumWriter<T> reflectDatumWriter = new ReflectDatumWriter<T>(avroSchema);
DataFileWriter<T> fileWriter = null;
try {
fileWriter = new DataFileWriter<T>(reflectDatumWriter);
fileWriter.setCodec(CodecFactory.snappyCodec());
fileWriter.create(avroSchema, out);
fileWriter.append(objectToSerialize);
fileWriter.close();
} catch (Exception e) {
LOG.error(e);
return null;
}
return out.toByteArray();
}