avro使用hadoop添加记录压缩级别

nnvyjq4y  于 2021-07-13  发布在  Hadoop
关注(0)|答案(0)|浏览(232)

我有以下工作代码,可以使用提供的模式将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()));

它工作得很好,虽然我仍然会感谢任何反馈。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题