Geomesa学习2 - 索引机制

GeoMesa一共有两大类索引,分别是普通属性索引、时空索引。

Geomesa时空索引使用了基于Z-order填充曲线的GeoHash空间索引技术,并对时间维度进行了扩展,共提供两类四种索引。其中2表示二维,即空间索引,3表示3维,即时空索引;Z表示点的索引,XZ表示线/面的索引。

(1) 空间索引(Z2和XZ2)

如果SimpleFeatureType有空间类型属性,如PointLineStringPolygon等,则GeoMesa会为该空间属性创建空间索引。如果有多个空间属性,则选择默认的一个简历索引,即以*作为前缀的属性,通过SimpleFeatureType.getGeometryDescriptor可以获取查看。

(2) 时空索引(Z3和XZ3)

如果SimpleFeatureType同时有空间属性和时间属性,则GeoMesa会在这两个属性上创建时空索引,建立索引的时间属性是第一个声明的属性,或者被显示指定的属性。

GeoMesa 索引的基本原理是将三维(经度、纬度、时间)的数据按照Z曲线进行降维, 得到一维数据作为Key使用,方便在key-value数据库中进行查询。

一、 空间填充曲线Z曲线

1.1 R树索引
Oracle SpatialMysql Spatial PostgreSQL都是基于R树进行空间搜索操作,对空间字段创建R树索引。但R树存在几点问题:
(1)R树索引需要单独创建一个索引文件
(2)当数据更新、新插入数据、删除数据时,为了平衡会更新整个R树
(3)不适合NoSQL接口,Hbase本身只提供基于rowKey和全表扫描的查询,rowkey索引单一,对于多维度的查询困难。

1.2 Z曲线
Z曲线具有下面两点优点:
(1)降维
(2)保持数据的locality特性
普通的关系数据无法对多维数据直接进行查询,通过使用空间填充曲线对空间实体数据集进行降维处理,映射到一维空间进行编码,就可以重复利用已有的B树索引Hash索引Bitmap索引等技术针对一维空间进行查询。

二、 GeoHash原理

GeoHash是空间索引的一种方式,基本原理是将地球理解为一个二维平面,将平面递归分解成更小的子块,每个字块在一定的经纬度范围内拥有相同的编码。以GeoHash方式建立空间索引,可以提高对空间数据进行经纬度检索的效率。

GeoHash将二维的经纬度进行二进制编码(逼近编码),之后将得到的二进制编码转换成字符串(Base32编码)。举例如下图所示。

Z曲线.jpg

● 字符串越长,表示的范围越小,空间位置越精确;字符串越短,表示的范围越大越宽泛;
● 字符串越相似表示距离空间越近。

三、 Geomesa Hbase索引

Z曲线上的每个点都可以赋予一个顺序值,通过这个顺序值,GeoMesa将经纬度表示为一个整数,这样就将二维数据降为一维数据,可以作为key-value数据库中的key使用。因为Z曲线支持多维数据,所以GeoMesa也支持将多维数据降为一维数据,作为key使用。
GeoMesa Hbase源码的类结构关系如下图所示。

geomesa-hbase类结构.png

GeoMesa HBase构建索引主要是将空间和时间、属性等信息组织在rowkey中,时空数据根据Z曲线降维之后的RowKey设计如下:

rowkey.png

Shard:空间数据的预分片,范围为1-127,默认为4。可以对数据schema进行设置:
simpleFeatureType.getUserData().put(“geomesa.z.splits”, “4”);

Epoch Week: 时间索引的时间间隔,z-index time interval,默认是week。可以对数据schema进行设置:
simpleFeatureType.getUserData().put(“geomesa.z3.interval”, “month”);

对于不同的索引类型有不同的rowkey结构,具体情况如下表所示。

索引类型 RowKey
Z2 ShardKey(1 byte)+Z2(x,y)(2 bytes)+FeatureID
Z3 ShardKey(1 byte)+Epoch Week(2 bytes)+Z3(x,y,t)(8 bytes)+FeatureID
XZ2 ShardKey(1 byte)+XZ2(minX, minY, maxX, maxY)(8 bytes)+FeatureID
XZ3 ShardKey(1 byte)+Epoch Week(2 bytes)+XZ3(minX, minY, maxX, maxY)(8 bytes)+FeatureID
Attribute IndxBytes(2 bytes)+ShardKey(1 byte)+AttrValue+SplitByte(1 byte)+SecondaryIndex(Z3/XZ3/Z2/XZ2)+FeatureID
FeatureID FeatureID

你可能感兴趣的:(Geomesa学习2 - 索引机制)