【发布时间】:2013-12-19 09:19:26
【问题描述】:
我正在尝试从存储在 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);
}
但是这段代码给了我一个:
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