Десериализация Avro данных из байтов - PullRequest
0 голосов
/ 05 марта 2020

Я пытаюсь десериализовать, т.е. получить объект класса org.apache.avro.generic.GenericRecord из байтового массива данных Avro. Эти данные содержат заголовок с полной схемой.

Пока я пробовал это:

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: недопустимая кодировка int в

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

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

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

Работает без нареканий. Я действительно не хочу записывать на диск каждое авро-сообщение, которое я получаю, потому что оно предназначено для работы в режиме реального времени.

Что я делаю не так при первом подходе?

...