Я пытаюсь прочитать данные из файла файла Avro, хранящегося в HDFS. Теперь я могу прочитать все данные, используя DataFileReader
или DataFileStream
. Теперь я хочу реализовать разбивку на страницы. Есть ли какой-нибудь конкретный способ сделать это?Pagination with Avro File
Я уже прошел через их основные документы и, согласно моему пониманию, я думаю, что это можно сделать, используя маркер синхронизации. Я попытался с помощью:
SeekableInput seekableInput = new AvroFSInput(dataInputStream, 5);
DatumReader<GenericRecord> datumReader = new GenericDatumReader<GenericRecord>();
DataFileReader<GenericRecord> fileReader = new DataFileReader<GenericRecord>(seekableInput, datumReader);
fileReader.seek(startOffset); // set to the start-offset
while (fileReader.hasNext() && !fileReader.pastSync(endOffset)) {
GenericRecord gr = fileReader.next();
System.out.println(gr);
}
Но этот код дает мне:
Exception in thread "main" org.apache.avro.AvroRuntimeException: java.io.IOException: Invalid sync!
at org.apache.avro.file.DataFileStream.hasNext(DataFileStream.java:210)
at com.globalids.test.AvroTest.deserializeWithPageing(AvroTest.java:112)
at com.globalids.test.AvroTest.main(AvroTest.java:45)
Caused by: java.io.IOException: Invalid sync!
at org.apache.avro.file.DataFileStream.nextRawBlock(DataFileStream.java:293)
at org.apache.avro.file.DataFileStream.hasNext(DataFileStream.java:198)
... 2 more
Я также попытался установить интервал синхронизации во время записи данных процесса. Также попытался вызвать метод sync() после того, как каждая запись была вставлена в файл, используя DataFileWriter
. Может ли кто-нибудь указать мне, что я делаю неправильно?
Заранее спасибо.
Этот код сделал работу. По крайней мере, это не дает мне никаких исключений. Но все же записи, которые я получаю, - это с самого начала файла. То, что я хотел сделать, это: Если мой startOffset равен 5, я хочу, чтобы fileReader начал читать с записи номер 5. Чтобы я мог переходить в любую запись, когда мне нужно для целей разбиения на страницы. Не могли бы вы предложить мне какую-нибудь идею? И большое вам спасибо за предыдущий ответ. – Pradatta