【问题标题】:Pagination with Avro File使用 Avro 文件进行分页
【发布时间】:2013-12-19 09:19:26
【问题描述】:

我正在尝试从存储在 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() 方法。 谁能指出我做错了什么?

提前谢谢你。

【问题讨论】:

    标签: java pagination deserialization avro


    【解决方案1】:

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

    【讨论】:

    • 这段代码确实有效。至少它没有给我任何例外。但我得到的记录仍然是从文件的最开始。我想做的是:如果我的 startOffset 是 5,那么我希望 fileReader 从第 5 条记录开始读取。这样我就可以在需要分页时跳入任何记录。你能给我建议吗?非常感谢您之前的回答。
    • Avro 不支持查找记录,但支持查找块。每个块都会告诉您其中有多少条记录,因此您可以计算出如何以这种方式获取特定索引。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-01
    相关资源
    最近更新 更多