2013-12-19 4 views
2

Я пытаюсь прочитать данные из файла файла 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. Может ли кто-нибудь указать мне, что я делаю неправильно?

Заранее спасибо.

ответ

1

Вы должны вызвать синхронизацию() вместо того, чтобы искать(), если startOffset не из действительного положения в файле:

SeekableInput seekableInput = new AvroFSInput(dataInputStream, 5);  
DatumReader<GenericRecord> datumReader = new GenericDatumReader<GenericRecord>(); 
DataFileReader<GenericRecord> fileReader = new DataFileReader<GenericRecord>(seekableInput, datumReader); 

**fileReader.sync(startOffset);** 

while (fileReader.hasNext() && !fileReader.pastSync(endOffset)) { 
    GenericRecord gr = fileReader.next(); 
    System.out.println(gr); 
} 
+0

Этот код сделал работу. По крайней мере, это не дает мне никаких исключений. Но все же записи, которые я получаю, - это с самого начала файла. То, что я хотел сделать, это: Если мой startOffset равен 5, я хочу, чтобы fileReader начал читать с записи номер 5. Чтобы я мог переходить в любую запись, когда мне нужно для целей разбиения на страницы. Не могли бы вы предложить мне какую-нибудь идею? И большое вам спасибо за предыдущий ответ. – Pradatta