Отправить сжатое сообщение с помощью avro

У меня есть 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);
</genericrecord></genericrecord></genericrecord></genericrecord>

Это то, что у меня есть до сих пор, и мне не хватает следующего:

Я хотел бы сжать данные перед отправкой, я скорее сделаю это, используя 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();
}
</t></t></t></t>

licensed under cc by-sa 3.0 with attribution.