2013-10-06 55 views
1

我有一個POJO需要發送到另一個端點(某些服務器)。 我決定使用avro做它。使用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來完成它,我應該如何將它與我的代碼結合起來?

UPDATE: 添加如下幾行:

// use snappy compression 
CodecFactory codecFactory = CodecFactory.snappyCodec(); 
dataFileWriter.setCodec(codecFactory); 

但我不知道但如果它的工作。

回答

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(); 
}