Java 使用Avro文件分页

Java 使用Avro文件分页,java,pagination,deserialization,avro,Java,Pagination,Deserialization,Avro,我正在尝试从存储在HDFS中的Avro文件读取数据。现在,到目前为止,我能够使用DataFileReader或DataFileStream读取整个数据。 现在我想实现分页。有什么具体的方法吗 我已经看过了他们的基本文档,根据我的理解,我认为这可以通过使用同步标记来完成。 我试过: SeekableInput seekableInput = new AvroFSInput(dataInputStream, 5); DatumReader<GenericRecord> d

我正在尝试从存储在HDFS中的Avro文件读取数据。现在,到目前为止,我能够使用
DataFileReader
DataFileStream
读取整个数据。 现在我想实现分页。有什么具体的方法吗

我已经看过了他们的基本文档,根据我的理解,我认为这可以通过使用同步标记来完成。 我试过:

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);
    }
我还尝试在数据写入过程中设置同步间隔。还尝试在使用
DataFileWriter
将每条记录插入文件后调用sync()方法。 有人能指出我做错了什么吗

先谢谢你

如果startOffset不是来自文件中的有效位置,则需要调用sync()而不是seek():

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);
}
SeekableInput SeekableInput=new-AvroFSInput(数据输入流,5);
DatumReader DatumReader=新的GenericDatumReader();
DataFileReader fileReader=新的DataFileReader(请参见KableInput、datumReader);
**同步(startOffset)**
while(fileReader.hasNext()&&!fileReader.pastSync(endOffset)){
GenericRecord gr=fileReader.next();
系统输出打印项次(gr);
}

此代码确实有效。至少它没有给我任何例外。但我得到的记录还是从文件的一开始。我想做的是:如果我的startOffset是5,那么我希望fileReader开始读取记录编号5。这样我就可以在需要分页时跳转到任何记录中。你能给我一些建议吗?非常感谢您之前的回答。Avro不支持查找记录,但支持查找块。每个块告诉您其中有多少条记录,这样您就可以知道如何通过这种方式获得特定的索引。
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);
}