java - 使用 Avro 文件分页

标签 java pagination deserialization avro

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

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

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 

我也试过在数据写入过程中设置同步间隔。还尝试在使用 DataFileWriter 将每条记录插入文件后调用 sync() 方法。 谁能指出我做错了什么?

Thank you in advance.

最佳答案

如果 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);
}

关于java - 使用 Avro 文件分页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20677600/

相关文章:

java - 未达到 Spring MVC 中的异常处理

java - Swing 外行分页

json - 如何在 Jackson 中编写自定义序列化器和反序列化器?

Java:本地缓存和更改

java - 确定基于 XML 文件的类型以指定相应的处理程序

java - Spring 或 hibernate 连接泄漏

java - 比较球员的优势和劣势

java - 验证者最好的方法是什么?

ruby-on-rails - Kaminari:数组的未定义方法 `total_pages'

jquery - 如何使用jquery查找当前幻灯片的数据