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