gpt4 book ai didi

java - 从字节反序列化 Avro 数据

转载 作者:行者123 更新时间:2023-12-05 07:12:02 26 4
gpt4 key购买 nike

我正在尝试反序列化,即从字节数组 Avro 数据中获取类 org.apache.avro.generic.GenericRecord 的对象。此数据包含带有完整架构的 header 。

到目前为止,我已经试过了:

public List<GenericRecord> deserializeGenericWithSchema(byte[] message) throws IOException {
List<GenericRecord> listOfRecords = new ArrayList<>();
DatumReader<GenericRecord> reader = new GenericDatumReader<>();
DataFileReader<GenericRecord> fileReader =
new DataFileReader<>(new SeekableByteArrayInput(message), reader);

GenericRecord record = null;

while (fileReader.hasNext()) {
listOfRecords.add(fileReader.next(record));
}

return listOfRecords;
}

但是我得到一个错误:

java.io.IOException: Invalid int encoding at

org.apache.avro.io.BinaryDecoder.readInt(BinaryDecoder.java:145) at

org.apache.avro.io.BinaryDecoder.readBytes(BinaryDecoder.java:282) at

org.apache.avro.file.DataFileStream.initialize(DataFileStream.java:112)

at org.apache.avro.file.DataFileReader.(DataFileReader.java:97)

但是,如果我将字节数组写入磁盘 message 并像这样更改我的函数:

public List<GenericRecord> deserializeGenericWithSchema(String fileName) throws IOException {
byte[] file = new File(fileName);
List<GenericRecord> listOfRecords = new ArrayList<>();
DatumReader<GenericRecord> reader = new GenericDatumReader<>();
DataFileReader<GenericRecord> fileReader =
new DataFileReader<>(file, reader);

GenericRecord record = null;

while (fileReader.hasNext()) {
listOfRecords.add(fileReader.next(record));
}

return listOfRecords;
}

它完美地工作。我真的不想将收到的每条 avro 消息都写入磁盘,因为这是为了实时工作。

我的第一种方法做错了什么?

最佳答案

你有任何跟进这个问题吗?我的假设是编码问题。 byte[] 从哪里来?它是您要写入磁盘的确切 byte[] 吗?也许解释是关于文件编写器和读取器的默认编码设置。

关于java - 从字节反序列化 Avro 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60553129/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com