我有以下工作代码,可以使用提供的模式将json转换为avro:
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
BinaryEncoder encoder = EncoderFactory.get().binaryEncoder(outputStream, null);
DatumWriter<Object> writer = new GenericDatumWriter(schema);
writer.write(jsonAsBinaryData, encoder);
encoder.flush();
return outputStream.toByteArray();
我尝试向上面添加压缩,但只有在使用datafilewriter时才成功,datafilewriter将架构添加到结果中(文件容器压缩级别)。使用hadoop lib直接压缩数据时,它不起作用(outputstream返回空):
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
DefaultCodec codec = ReflectionUtils.newInstance(DefaultCodec.class, new org.apache.hadoop.conf.Configuration());
OutputStream compressedOutputStream = codec.createOutputStream(outputStream);
BinaryEncoder encoder = EncoderFactory.get().binaryEncoder(compressedOutputStream, null);
DatumWriter<Object> writer = new GenericDatumWriter<>(schema);
writer.write(jsonAsBinaryData, encoder);
encoder.flush();
return outputStream.toByteArray();
我错过了什么?
为了使用avro lib中的deflate编解码器压缩整个字节数组,我在第一个代码段的末尾添加了以下代码:
DeflateCodec codec = new DeflateCodec(5);
var out = codec.compress(ByteBuffer.wrap(outputStream.toByteArray()));
它工作得很好,虽然我仍然会感谢任何反馈。
暂无答案!
目前还没有任何答案,快来回答吧!