生成ShapeRecordReader的类ShapeInputFormat,其具体实现已在spatialhadoop2.1源码阅读(三) 自定义InputFormat(SpatialInputFormat & ShapeInputFormat)中介绍,具体可看该文章。本文主要介绍网格索引生成过程中使用的ShapeRecordReader 和SpatialRecordReader
1.ShapeRecordReader
ShapeRecordReader继承自SpatialRecordReader,ShapeRecordReader中最重要的三个方法为createKey,createValue和next。除此之外还有三个构造器。这六个方法的具体实现都是对父类相应方法的调用,所以实现重点在于SpatialRecordReader类。
public class ShapeRecordReader<S extends Shape>
extends SpatialRecordReader<Rectangle, S> {
@SuppressWarnings("unused")
private static final Log LOG = LogFactory.getLog(ShapeRecordReader.class);
/**Object used for deserialization*/
private S stockShape;
public ShapeRecordReader(Configuration job, FileSplit split)
throws IOException {
super(job, split);
stockShape = (S) SpatialSite.createStockShape(job);
}
public ShapeRecordReader(CombineFileSplit split, Configuration conf,
Reporter reporter, Integer index) throws IOException {
super(split, conf, reporter, index);
stockShape = (S) SpatialSite.createStockShape(conf);
}
public ShapeRecordReader(InputStream in, long offset, long endOffset)
throws IOException {
super(in, offset, endOffset);
}
@Override
public boolean next(Rectangle key, S shape) throws IOException {
boolean read_line = nextShape(shape);
key.set(cellMbr);
return read_line;
}
@Override
public Rectangle createKey() {
return new Rectangle();
}
@Override
public S createValue() {
return stockShape;
}
}
构造函数和spatialhadoop2.3源码阅读(九) ShapeLineInputFormat & ShapeLineRecordReader & SpatialRecordReader[FileMBR]中介绍的完全相同,具体可看该文章。
在ShapeRecordReader的next方法中,调用了父类的nextShape方法,nextShape方法中又调用了nextLine方法,具体见spatialhadoop2.3源码阅读(九) ShapeLineInputFormat & ShapeLineRecordReader & SpatialRecordReader[FileMBR]中对nextLine方法的介绍。
protected boolean nextShape(Shape s) throws IOException {
if (!nextLine(tempLine))
return false;
s.fromText(tempLine);
return true;
}
nextShape先调用nextLine获得一行数据,再将其解析成stockShape所代表的实际类型。
注意,此时的cellMbr成员变量中存储的为当前文件的最小包围矩形,这不同于FileMBR时。