CN112925789A - 一种基于Spark的空间矢量数据内存存储查询方法及*** - Google Patents
一种基于Spark的空间矢量数据内存存储查询方法及*** Download PDFInfo
- Publication number
- CN112925789A CN112925789A CN202110208391.6A CN202110208391A CN112925789A CN 112925789 A CN112925789 A CN 112925789A CN 202110208391 A CN202110208391 A CN 202110208391A CN 112925789 A CN112925789 A CN 112925789A
- Authority
- CN
- China
- Prior art keywords
- partition
- data
- grid
- query
- space
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/22—Indexing; Data structures therefor; Storage structures
- G06F16/2228—Indexing structures
- G06F16/2246—Trees, e.g. B+trees
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/24—Querying
- G06F16/245—Query processing
- G06F16/2457—Query processing with adaptation to user needs
- G06F16/24575—Query processing with adaptation to user needs using context
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/24—Querying
- G06F16/245—Query processing
- G06F16/2458—Special types of queries, e.g. statistical queries, fuzzy queries or distributed queries
- G06F16/2465—Query processing support for facilitating data mining operations in structured databases
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/25—Integrating or interfacing systems involving database management systems
- G06F16/252—Integrating or interfacing systems involving database management systems between a Database Management System and a front-end application
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/29—Geographical information databases
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Databases & Information Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- Data Mining & Analysis (AREA)
- Computational Linguistics (AREA)
- Software Systems (AREA)
- Remote Sensing (AREA)
- Fuzzy Systems (AREA)
- Mathematical Physics (AREA)
- Probability & Statistics with Applications (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明提出一种基于Spark的空间矢量数据内存存储查询方法及***,所述方法及***为海量空间矢量数据在Spark内存中的存储结构和空间查询操作提供了新的解决方案,针对数据空间分布不均衡以及跨分区存储的现象,提出了一种带有buffer分区的非均匀网格分区方法。在每个分区中引入四叉网格树的结构进行数据的局部索引,通过合理剪枝,其有效提高每个分区的本地查询效率。基于本发明提出的空间数据内存结构,可以将Spark扩展为支持KNN和范围查询的分布式***。通过对存储和查询过程进行封装,该执行过程对用户透明,用户可以通过传递参数直接调用对应的算子。
Description
技术领域
本发明涉及空间数据存储查询,特别涉及一种基于Spark的空间矢量数据内存存储查询方法及***,属于GIS领域。
背景技术
广义上的空间数据是指所有具有空间特征的数据,当前广泛应用于森林调查、国土资源调查以及导航等领域。但是,近年来随着遥感以及移动互联网等技术的迅猛发展,空间数据的规模空前增长,如果继续按照传统的地理信息***(GIS)的方式进行数据存储与查询,行业会面临海量数据带来的巨大处理压力。随着大数据概念的产生以及相关技术的迅猛发展,GIS领域迎来了新的曙光。Hadoop作为大数据时代具有代表性的成果被广泛应用于空间数据的存储与处理,其中包括Hadoop-GIS、SpatialHadoop等分布式框架。但是Hadoop本身的特点导致在计算过程中***会多次访盘以及中间结果的落盘。而Spark作为内存计算计算引擎在数据分析领域备受青睐,因此其Spark一经推出便涌现出GeoSpark、Simba等空间数据处理框架,但是这些工作更多的是将传统的空间数据以及数据存储与处理方式引入Spark中并扩展优化,如GeoSpark基于Spark实现了R-Tree、四叉树等空间索引结构,Simba通过扩展Spark SQL并实现多种空间连接算子。但是由于空间数据通常是不规则的结构,包含点、线、面等不同类型,同时基于Spark的空间数据存储与查询通常需要考虑全局与局部两个处理过程。因此,如果仅仅将传统GIS中的空间数据存储结构和查询策略迁移到Spark中,会出现数据跨分区存储以及数据倾斜的现象,从而产生额外的网络通信并不同工作节点之间任务执行效率存在较大差异;同时,在每个分区内数据的查询效率会受限于索引结构,从而降低每个Spark任务的执行速度,因此本***及其方法通过考虑数据的空间属性和类别对RDD内存结构进行重新组织并封装为自定义的RDD,基于该存储结构设计范围查询和KNN查询策略并以Spark算子的形式进行实现以供用户调用。
发明内容
为了解决考虑数据的空间属性和类别不全面、数据跨分区存储以及数据倾斜的现象、查询执行效率低的问题,本发明公开了一种基于Spark的空间矢量数据内存存储查询方法及***,通过考虑数据的空间属性和类别对RDD内存结构进行重新组织并封装为自定义的RDD,基于该存储结构设计范围查询和KNN查询策略并以Spark算子的形式进行实现以供用户调用,本发明的具体方案如下:
方案一:一种基于Spark的空间矢量数据内存存储查询***,该***包括底层基础设施层、数据处理层和用户接口层;其中,底层基础设施层包括矢量数据读取模块,数据处理层包括数据网格索引模块、网格分区模块和封装模块,用户接口层包括查询模块,各层次顺次连接,各模块之间按照递进逻辑顺序相连接;
其中矢量数据读取模块负责将空间矢量数据提取出来;
数据网格索引模块负责根据空间对象的特征进行网格索引;
网格分区模块基于所述的数据网格索引模块索引后的数据进行网格分区;
封装模块负责将数据包按类别封装为算子;
查询模块进行空间数据的剪枝操作完成Spark的空间矢量数据内存存储查询。
进一步地,所述的网格分区模块通过判断空间对象是否与多个网格单元相交,从而进行空间对象分配功能。
进一步地,所述的空间对象分配功能,具体包括网格单元相交情况下的分配buffer分区后聚类并存储功能,以及网格单元不相交情况下的四叉树索引后按类别聚类并存储功能
方案二:一种基于Spark的空间矢量数据内存存储查询方法,是基于上述***为基础而实现的,具体方法步骤如下:
步骤S101,利用所述的数据读取模块将空间矢量数据从文件***或数据库中读取到Spark RDD中;
步骤S102,在所述的数据网格索引模块对所有数据进行抽样,并判断数据集中空间对象的分布,根据分布特征构建非均匀网格索引;
步骤S103,根据步骤S102得到的非均匀网格索引,对原始的RDD基于该索引进行重分区操作,在分区过程中判断空间对象是否与多个网格单元相交;
步骤S104,所述的网格分区模块根据所述的数据网格索引模块索引后的数据,判断是否相交从而进行分支,如果“是”则执行S105和S106,否则执行S107和S108.;
步骤S105,将空间对象分配到buffer分区,并根据同时跨越的两个分区号为该对象分配Key值;
步骤S106,对分区内的空间对象按照Key值划分为Bundle,在每个Bundle中按照其所属类别进行聚类并存储;
步骤S107,将空间对象分配到该格网单元所对应的分区中;
步骤S108,基于空间属性对空间对象按照自自定义的四叉网格树进行索引,叶子节点按照类别聚类并存储;
步骤S109,利用所述的封装模块将该结构存储为一个新的RDD,基于该存储结构的空间数据设计了新的空间查询算法并封装为算子;
步骤S110,最终用户通过所述的查询模块调用对应的查询算子可以实现范围查询和KNN查询操作。
进一步地,在步骤S101中,Spark集群在计算过程中直接对该文件***进行读写操作;对于读取到内存中的数据,Spark集群通过map操作调用GeoTools工具和JTS库,将读取到的条目或者空间数据流解析为Geometry空间对象并以原始RDD的形式存储到Spark集群内存中。
进一步地,在步骤S102中对空间数据抽样并根据数据的空间分布特征构建非均匀网格索引具体过程为:首先计调用Spark RDD的sample算子对数据进行抽样操作,将抽样的结果拉取到客户端,在客户端通过递归的方式将整个区域划分为非均匀大小的格网,最后对所有的格网使用Z曲线进行编码,最终得到的是一个非均匀网格索引。
进一步地,在步骤S103中,所述的网格分区模块的网格重分区过程细化为:
(1)网格单元相交情况下的分配buffer分区后,如果仅与一个单元格网相交,该对象的Key值设为格网号,否则以每两个相邻的格网号作为前缀和后缀组成的字符串作为空间对象的Key值,然后对全部空间对象执行重分区操作,其中每个格网号对应的分区成为非均匀网格分区,另一个称为buffer分区;
(2)在buffer分区中,对分区内的空间对象按照Key值划分为Bundle,在每个Bundle中按照其所属类别进行聚类并存储,而在非均匀网格分区中基于空间属性对空间对象按照自自定义的四叉网格树进行索引,叶子节点按照类别聚类并存储;
(3)将重新组织好的上述两种结构的空间对象集合作为不同分区存储到自定义的RDD中,根据空间数据的全局网格索引和各个分区内部的局部索引,针对不同查询任务进行剪枝操作,过滤不符合条件的分区以及叶子节点。
进一步地,在步骤S108中,所述的四叉网格树是一种面向点、线以及面多种空间数据的空间索引结构,首先基于四叉树对分区内的空间对象构建索引,将数据存储于叶子节点,其中叶子节点中的空间对象根据其所属的类别进行聚类并根据类别按序存储;
构建四叉树的同时根据四叉树的深度构建均匀网格索引,每个格网单元存储空间上相应位置叶子节点对象的指针或句柄;为了同时处理点、线以及面等不同数据类型,在索引过程中通过判断空间对象是否与叶节点所代表区域相交作为依据进行多副本索引。
进一步地,在步骤S109中,所述的空间查询后封装为算子的过程,是对范围查询和KNN查询两种操作的封装,通过向算子传递查询条件作为参数可以执行查询任务,并将结果以RDD的形式进行返回,具体过程如下:
首先驱动程序根据空间数据的全局索引判断每个分区是否在查询条件范围内,选择可能存在满足条件数据的分区进一步判断;如果当前分区为buffer分区,根据全局索引和空间对象的Key值对数据进行过滤,在每个Key值对应的Bundle中选中目标类别的数据并执行遍历操作;其次,为了去除重复值,结果被存储到Set集合中;如果当前分区是非均匀网格分区,根据四叉网格索引中的网格索引进行数据的查询;最后,将每个分区的查询结果作为一个新的分区返回到结果RDD中,完成空间数据的封装。
本发明的有益效果体现在:
本发明所提供的方法及***为海量空间矢量数据在Spark内存中的存储结构和空间查询操作提供了新的解决方案,针对空间数据分布不均衡以及跨分区存储的现象,提出了一种带有buffer分区的非均匀网格分区方法。对于每个分区中的空间数据,为了提高本地查询的效率引入支持点、线、面等不同格式的四叉网格树的结构进行数据的局部索引。通过提出的空间数据内存结构可以高效执行KNN和范围查询。***对存储和查询过程进行封装,在执行的时候该过程对用户透明,用户只需调用相应的算子并传递参数即可。
附图说明
为了更清楚地说明本发明或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明中记载的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图:
图1为本发明实施例的空间数据存储查询***结构图
图2为本发明实施例的空间数据存储查询流程图;
图3为本发明实施例的非均匀网格索引与buffer分区示意图;
图4为本发明实施例的buffer分区索引结构示意图;
图5为本发明实施例的四叉网格树索引结构示意图;
图6为本发明实施例的空间查询任务流图;
图7为本发明实施例的范围查询伪代码示例图;
图8为本发明实施例的KNN查询伪代码示例图;
图9为本发明实施例的统***架构图。
具体实施方式
为了使本技术领域的人员更好地理解本发明实施例中的技术方案,并使本发明的上述目的、特征和优点能够更加明显易懂,下面结合附图对本发明中技术方案作进一步详细的说明。
具体实施方式一:一种基于Spark的空间矢量数据内存存储查询***,该***包括底层基础设施层、数据处理层和用户接口层;其中,底层基础设施层包括矢量数据读取模块,数据处理层包括数据网格索引模块、网格分区模块和封装模块,用户接口层包括查询模块,各层次顺次连接,各模块之间按照递进逻辑顺序相连接;其中矢量数据读取模块负责将空间矢量数据提取出来;数据网格索引模块负责根据空间对象的特征进行网格索引;网格分区模块基于所述的数据网格索引模块索引后的数据进行网格分区;封装模块负责将数据包按类别封装为算子;查询模块进行空间数据的剪枝操作完成Spark的空间矢量数据内存存储查询;
各层级具体结构如下:
(1)底层基础设施层:包括Spark集群软硬件平台以及用于空间数据存储的文件***,Spark集群在计算过程中可以直接对该文件***进行读写操作。对于读取到内存中的数据,Spark通过map操作调用GeoTools和JTS库,将读取到的条目或者空间数据流解析为Geometry空间对象并以原始RDD的形式存储到Spark集群内存中;
(2)数据处理层:
对加载到Spark内存中的空间数据进行抽样,并判断数据集中空间对象的分布,根据分布特征构建非均匀网格索引;
对原始RDD基于该索引执行重分区操作,在分区过程中判断每一个空间对象是否与两个及以上网格单元相交;
如果仅与一个单元格网相交,该对象的Key值设为格网号,否则以每两个相邻的格网号作为前缀和后缀组成的字符串作为空间对象的Key值,然后对全部空间对象执行重分区操作,其中每个格网号对应的分区成为非均匀网格分区,另一个称为buffer分区;
在buffer分区中,对分区内的空间对象按照Key值划分为Bundle,在每个Bundle中按照其所属类别进行聚类并存储,而在非均匀网格分区中基于空间属性对空间对象按照自自定义的四叉网格树进行索引,叶子节点按照类别聚类并存储;
将重新组织好的上述两种结构的空间对象集合作为不同分区存储到自定义的RDD中,根据空间数据的全局网格索引和各个分区内部的局部索引,针对不同查询任务进行剪枝操作,过滤不符合条件的分区以及叶子节点;
(3)用户接口层,用于对用户屏蔽底层繁杂的操作,用户可以通过调用不同的算子实现对原始数据的分区索引,并基于自定义RDD进行空间数据查询;
所述***中,对空间数据抽样并根据数据的空间分布特征构建非均匀网格索引具体过程为:首先计调用Spark RDD的sample算子对数据进行抽样操作,将抽样的结果拉取到客户端,在客户端通过递归的方式将整个区域划分为非均匀大小的格网,最后对所有的格网使用Z曲线进行编码。最终得到的是一个非均匀网格索引;
所述***中,原始RDD重分区操作是根据上述生成的非均匀网格索引自定义Partitioner类,通过在getPartition方法中对每一个空间对象和格网的相交情况来指定空间对象的分区。然后调用partitionBy方法可以实现对空间数据的重分区操作;
所述***中,四叉网格树是一种面向点、线以及面多种空间数据的空间索引结构,首先基于四叉树对分区内的空间对象构建索引,将数据存储于叶子节点,其中叶子节点中的空间对象根据其所属的类别进行聚类并根据类别按序存储。在构建四叉树的同时根据四叉树的深度构建均匀网格索引,每个格网单元存储空间上相应位置叶子节点对象的指针或句柄。为了同时处理点、线以及面等不同数据类型,在索引过程中通过判断空间对象是否与叶节点所代表区域相交作为依据进行多副本索引;
所述***中,空间查询算子是对范围查询和KNN查询两种操作的封装,通过向算子传递查询条件作为参数可以执行查询任务,并将结果以RDD的形式进行返回。具体过程为:首先驱动程序根据空间数据的全局索引判断每个分区是否在查询条件范围内,选择可能存在满足条件数据的分区进一步判断。如果当前分区为buffer分区,根据全局索引和空间对象的Key值对数据进行过滤,在每个Key值对应的Bundle中选中目标类别的数据并执行遍历操作。为了去除重复值,结果被存储到Set集合中。如果当前分区是非均匀网格分区,根据四叉网格索引中的网格索引进行数据的查询。最后将每个分区的查询结果作为一个新的分区返回到结果RDD中。
具体实施方式二:本实施例通过如下方法来实现,一种基于Spark的空间矢量数据内存存储查询方法,如图1所示,包括:
S101:***将空间矢量数据从文件***或数据库中读取到Spark RDD中
S102:对所有数据进行抽样,并判断数据集中空间对象的分布,根据分布特征构建非均匀网格索引
S103:对原始的RDD基于该索引进行重分区操作,在分区过程中判断空间对象是否与多个网格单元相交
S104:根据是否相交进行分支判断,如果“是”则执行S105和S106,否则执行S107和S108.
S105:将空间对象分配到buffer分区,并根据同时跨越的两个分区号为该对象分配Key值
S106:对分区内的空间对象按照Key值划分为Bundle,在每个Bundle中按照其所属类别进行聚类并存储
S107:将空间对象分配到该格网单元所对应的分区中
S108:基于空间属性对空间对象按照自自定义的四叉网格树进行索引,叶子节点按照类别聚类并存储
S109:将该结构存储为一个新的RDD,基于该存储结构的空间数据设计了新的空间查询算法并封装为算子
S110:用户通过调用对应的查询算子可以实现范围查询和KNN查询操作
对于数据结构的设计分为全局分区与局部索引两个部分:
在本实施例中将分区后的空间数据使用Z曲线进行分区编码,阶数为N,根据Spark调优的原则,分区数为CPU核数number的3倍时效果最好,因此得出:
core
每个分区内空间对象的数量阈值为:
然后对Spark RDD中的空间对象进行抽样,根据采样因子和总体数据每个分区的阈值构建网格索引,对于超出阈值的格网单元进行递归二次划分,最终满足条件的非均匀网格索引即为整个数据集的全局分区划分结构。原始RDD中的每个空间对象与所有格网单元进行比对,如果该对象完全包含于格网单元,则将该对象的Key值设为格网ID,否则对于跨格网的空间对象其Key值以其相交的两个相邻格网ID作为前缀和后缀组成的字符串,形式如图3所示。
在数据进行局部索引的过程中,对应于S105、S106和S107、S108,非均匀网格分区与buffer分区分别进行不同的处理,过程如下:
如图4所示,在buffer分区中,将首先根据Key值对数据进行聚类排序,其中每个Key值对应一个Bundle,在Bundle中再根据空间对象的类别进行聚类,保证数据的有序性。
如图5所示,为非均匀网格分区中的局部索引结构,在本实施例中,该索引结构的构建是通过先批量将空间对象***到四叉树中,然后动态更新网格索引,该网格索引是由四叉树层数决定的均匀网格结构,每个格网存储指向对应叶子节点的指针或句柄,由于不能保证所有的叶子节点在四叉树的同一层中,因此在格网中需要存储叶子节点当前指向的叶子节点所在的层数。当根据空间属性进行数据查询的时候,无需从根节点完整遍历整个四叉树,只需要以O(1)复杂度即可定位到当前叶子节点。
所述方法中,空间查询操作主要包含范围查询和KNN查询,空间查询的主要工作流程如图6所示,原始RDD转换为自定义的RDD之后调用空间查询算子,每个分区根据查询条件进行对数据进行过滤并讲结果集合返回到当前分区,生成结果RDD。对于范围查询其伪代码如图7所示,流程如下:
输入为目标区域的范围和目标数据的类别。
具体过程为:首先驱动程序根据全局索引判断与目标区域相交的分区,并将得到的分区ID进行广播。在每个待查询分区中判断当前分区的类型,如果为buffer分区,根据广播的ID列表筛选出所有前后缀在该列表中的Bundle,再对每个Bundle中的目标类别进行遍历筛选出满足条件的空间对象,然后将其存储到Set集合中。如果当前分区为四叉网格树分区,根据其中的网格索引对数据进行本地的范围查询,结果也以Set集合的形式进行存储。
KNN查询伪代码如图8所示,流程如下:
输入为查询条件K值、查询点位置和目标数据的类别。
具体方法为:初始化一个长度为K的队列用于存储最终结果,同时定义每个分区中查询的局部结果到查询点的最大和最小距离max/min_distance。在buffer分区和四叉网格索引分区中分别计算出本地KNN的结果列表,然后根据max/min_distance过滤其中不符合条件的分区,其原理为:对于一个结果列表S,如果存在另一个列表T,且T.max_distance<S.min_distance,则该结果列表一定不满足要求。因此,可以直接过滤该结果列表。对于其他的结果列表,将其拉取到驱动程序节点,将队列进行归并得到最终结果。
具体实施方式三:除具体实施方式一所描述的***,本实施例还提出一种基于Spark的空间矢量数据内存存储查询***,如图9所示为该***的架构图,自底向上依次为:
S803:底层基础设施层,包括Spark集群软硬件平台以及用于空间数据存储的文件***,Spark集群在计算过程中可以直接对该文件***进行读写操作。对于读取到内存中的数据,Spark通过map操作调用GeoTools和JTS库,将读取到的条目或者空间数据流解析为Geometry空间对象并以原始RDD的形式存储到Spark集群内存中。
S802:数据处理层,对加载到Spark内存中的空间数据进行抽样,并判断数据集中空间对象的分布,根据分布特征构建非均匀网格索引
对原始RDD基于该索引执行重分区操作,在分区过程中判断每一个空间对象是否与两个及以上网格单元相交
如果仅与一个单元格网相交,该对象的Key值设为格网号,否则以每两个相邻的格网号作为前缀和后缀组成的字符串作为空间对象的Key值,然后对全部空间对象执行重分区操作,其中每个格网号对应的分区成为非均匀网格分区,另一个称为buffer分区。
在buffer分区中,对分区内的空间对象按照Key值划分为Bundle,在每个Bundle中按照其所属类别进行聚类并存储,而在非均匀网格分区中基于空间属性对空间对象按照自自定义的四叉网格树进行索引,叶子节点按照类别聚类并存储。
将重新组织好的上述两种结构的空间对象集合作为不同分区存储到自定义的RDD中,根据空间数据的全局网格索引和各个分区内部的局部索引,针对不同查询任务进行剪枝操作,过滤不符合条件的分区以及叶子节点。
S801:用户接口层,用于对用户屏蔽底层繁杂的操作,用户可以通过调用不同的算子实现对原始数据的分区索引,并基于自定义RDD进行空间数据查询。
所述***中,对空间数据抽样并根据数据的空间分布特征构建非均匀网格索引具体过程为:首先计调用Spark RDD的sample算子对数据进行抽样操作,将抽样的结果拉取到客户端,在客户端通过递归的方式将整个区域划分为非均匀大小的格网,最后对所有的格网使用Z曲线进行编码。最终得到的是一个非均匀网格索引。
所述***中,原始RDD重分区操作是根据上述生成的非均匀网格索引自定义Partitioner类,通过在getPartition方法中对每一个空间对象和格网的相交情况来指定空间对象的分区。然后调用partitionBy方法可以实现对空间数据的重分区操作。
所述***中,四叉网格树是一种面向点、线以及面多种空间数据的空间索引结构,首先基于四叉树对分区内的空间对象构建索引,将数据存储于叶子节点,其中叶子节点中的空间对象根据其所属的类别进行聚类并根据类别按序存储。在构建四叉树的同时根据四叉树的深度构建均匀网格索引,每个格网单元存储空间上相应位置叶子节点对象的指针或句柄。为了同时处理点、线以及面等不同数据类型,在索引过程中通过判断空间对象是否与叶节点所代表区域相交作为依据进行多副本索引。
所述***中,空间查询算子是对范围查询和KNN查询两种操作的封装,通过向算子传递查询条件作为参数可以执行查询任务,并将结果以RDD的形式进行返回。具体过程为:首先驱动程序根据空间数据的全局索引判断每个分区是否在查询条件范围内,选择可能存在满足条件数据的分区进一步判断。如果当前分区为buffer分区,根据全局索引和空间对象的Key值对数据进行过滤,在每个Key值对应的Bundle中选中目标类别的数据并执行遍历操作。为了去除重复值,结果被存储到Set集合中。如果当前分区是非均匀网格分区,根据四叉网格索引中的网格索引进行数据的查询。最后将每个分区的查询结果作为一个新的分区返回到结果RDD中。
具体实施方式四:除具体实施方式二所提供的方法,本实施例还可以进行如下方式实现,具体过程包括:
***将空间矢量数据从文件***或数据库中读取到Spark内存中并以原始RDD的形式存储。
对RDD中所有数据进行抽样,并判断数据集中空间对象的分布,根据分布特征构建非均匀网格索引
对原始RDD基于该索引执行重分区操作,在分区过程中判断每一个空间对象是否与两个及以上网格单元相交
如果仅与一个单元格网相交,该对象的Key值设为格网号,否则以每两个相邻的格网号作为前缀和后缀组成的字符串作为空间对象的Key值,然后对全部空间对象执行重分区操作,其中每个格网号对应的分区成为非均匀网格分区,另一个称为buffer分区。
在buffer分区中,对分区内的空间对象按照Key值划分为Bundle,在每个Bundle中按照其所属类别进行聚类并存储,而在非均匀网格分区中基于空间属性对空间对象按照自自定义的四叉网格树进行索引,叶子节点按照类别聚类并存储。
将重新组织好的上述两种结构的空间对象集合作为不同分区存储到自定义的RDD中,根据空间数据的全局网格索引和各个分区内部的局部索引,针对不同查询任务进行剪枝操作,过滤不符合条件的分区以及叶子节点。
针对该自定义RDD对象分别将所述范围查询和KNN查询封装为Spark算子,用户可以通过参数传递的方式直接调用该算子。
所述方法中,空间数据被加载到Spark内存之后使用GeoTools和JTS空间数据处理工具将每一个条目的数据转换为空间对象,其中每个RDD要素为一个Geometry对象。
所述方法中,对空间数据抽样并根据数据的空间分布特征构建非均匀网格索引具体过程为:首先计调用Spark RDD的sample算子对数据进行抽样操作,将抽样的结果拉取到客户端,在客户端通过递归的方式将整个区域划分为非均匀大小的格网,最后对所有的格网使用Z曲线进行编码。最终得到的是一个非均匀网格索引。
所述方法中,原始RDD重分区操作是根据上述生成的非均匀网格索引自定义Partitioner类,通过在getPartition方法中对每一个空间对象和格网的相交情况来指定空间对象的分区。然后调用partitionBy方法可以实现对空间数据的重分区操作。
所述方法中,四叉网格树是一种面向点、线以及面多种空间数据的空间索引结构,首先基于四叉树对分区内的空间对象构建索引,将数据存储于叶子节点,其中叶子节点中的空间对象根据其所属的类别进行聚类并根据类别按序存储。在构建四叉树的同时根据四叉树的深度构建均匀网格索引,每个格网单元存储空间上相应位置叶子节点对象的指针或句柄。为了同时处理点、线以及面等不同数据类型,在索引过程中通过判断空间对象是否与叶节点所代表区域相交作为依据进行多副本索引。
所述方法中,空间查询算子是对范围查询和KNN查询两种操作的封装,通过向算子传递查询条件作为参数可以执行查询任务,并将结果以RDD的形式进行返回。具体过程为:首先驱动程序根据空间数据的全局索引判断每个分区是否在查询条件范围内,选择可能存在满足条件数据的分区进一步判断。如果当前分区为buffer分区,根据全局索引和空间对象的Key值对数据进行过滤,在每个Key值对应的Bundle中选中目标类别的数据并执行遍历操作。为了去除重复值,结果被存储到Set集合中。如果当前分区是非均匀网格分区,根据四叉网格索引中的网格索引进行数据的查询。最后将每个分区的查询结果作为一个新的分区返回到结果RDD中。
本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于***实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
虽然通过实施例描绘了本发明,本领域普通技术人员知道,本发明有许多变形和变化而不脱离本发明的精神,希望所附的权利要求包括这些变形和变化而不脱离本发明的精神;综上,本实施方式只是对本专利的示例性说明,并不限定它的保护范围,本领域技术人员还可以对其局部进行改变,只要没有超出本专利的精神实质,都在本专利的保护范围内。
Claims (10)
1.一种基于Spark的空间矢量数据内存存储查询***,其特征在于:该***包括底层基础设施层、数据处理层和用户接口层;其中,底层基础设施层包括矢量数据读取模块,数据处理层包括数据网格索引模块、网格分区模块和封装模块,用户接口层包括查询模块;
其中矢量数据读取模块负责将空间矢量数据提取出来;
数据网格索引模块负责根据空间对象的特征进行网格索引;
网格分区模块基于所述的数据网格索引模块索引后的数据进行网格分区;
封装模块负责将数据包按类别封装为算子;
查询模块进行空间数据的剪枝操作完成Spark的空间矢量数据内存存储查询。
2.根据权利要求1所述的一种基于Spark的空间矢量数据内存存储查询***,其特征在于:所述的网格分区模块通过判断空间对象是否与多个网格单元相交,从而进行空间对象分配功能。
3.根据权利要求2所述的一种基于Spark的空间矢量数据内存存储查询***,其特征在于:所述的空间对象分配功能,具体包括网格单元相交情况下的分配buffer分区后聚类并存储功能,以及网格单元不相交情况下的四叉树索引后按类别聚类并存储功能。
4.一种基于Spark的空间矢量数据内存存储查询方法,是基于权利要求1-3中任一一项所述的***为基础而实现的,其特征在于:具体方法步骤如下:
步骤S101,利用所述的数据读取模块将空间矢量数据从文件***或数据库中读取到Spark RDD中;
步骤S102,在所述的数据网格索引模块对所有数据进行抽样,并判断数据集中空间对象的分布,根据分布特征构建非均匀网格索引;
步骤S103,根据步骤S102得到的非均匀网格索引,对原始的RDD基于该索引进行重分区操作,在分区过程中判断空间对象是否与多个网格单元相交;
步骤S104,所述的网格分区模块根据所述的数据网格索引模块索引后的数据,判断是否相交从而进行分支,如果“是”则执行S105和S106,否则执行S107和S108.;
步骤S105,将空间对象分配到buffer分区,并根据同时跨越的两个分区号为该对象分配Key值;
步骤S106,对分区内的空间对象按照Key值划分为Bundle,在每个Bundle中按照其所属类别进行聚类并存储;
步骤S107,将空间对象分配到该格网单元所对应的分区中;
步骤S108,基于空间属性对空间对象按照自自定义的四叉网格树进行索引,叶子节点按照类别聚类并存储;
步骤S109,利用所述的封装模块将该结构存储为一个新的RDD,基于该存储结构的空间数据设计了新的空间查询算法并封装为算子;
步骤S110,最终用户通过所述的查询模块调用对应的查询算子可以实现范围查询和KNN查询操作。
5.根据权利要求4所述的一种基于Spark的空间矢量数据内存存储查询方法,其特征在于:在步骤S101中,Spark集群在计算过程中直接对该文件***进行读写操作;对于读取到内存中的数据,Spark集群通过map操作调用GeoTools工具和JTS库,将读取到的条目或者空间数据流解析为Geometry空间对象并以原始RDD的形式存储到Spark集群内存中。
6.根据权利要求5所述的一种基于Spark的空间矢量数据内存存储查询方法,其特征在于:在步骤S102中对空间数据抽样并根据数据的空间分布特征构建非均匀网格索引具体过程为:首先计调用Spark RDD的sample算子对数据进行抽样操作,将抽样的结果拉取到客户端,在客户端通过递归的方式将整个区域划分为非均匀大小的格网,最后对所有的格网使用Z曲线进行编码。最终得到的是一个非均匀网格索引。
7.根据权利要求4所述的一种基于Spark的空间矢量数据内存存储查询方法,其特征在于:在步骤S103中,所述的网格分区模块的网格重分区过程细化为:
a.网格单元相交情况下的分配buffer分区后,如果仅与一个单元格网相交,该对象的Key值设为格网号,否则以每两个相邻的格网号作为前缀和后缀组成的字符串作为空间对象的Key值,然后对全部空间对象执行重分区操作,其中每个格网号对应的分区成为非均匀网格分区,另一个称为buffer分区;
b.在buffer分区中,对分区内的空间对象按照Key值划分为Bundle,在每个Bundle中按照其所属类别进行聚类并存储,而在非均匀网格分区中基于空间属性对空间对象按照自自定义的四叉网格树进行索引,叶子节点按照类别聚类并存储;
c.将重新组织好的上述两种结构的空间对象集合作为不同分区存储到自定义的RDD中,根据空间数据的全局网格索引和各个分区内部的局部索引,针对不同查询任务进行剪枝操作,过滤不符合条件的分区以及叶子节点。
8.根据权利要求6所述的一种基于Spark的空间矢量数据内存存储查询方法,其特征在于:在步骤S108中,所述的四叉网格树是一种面向点、线以及面多种空间数据的空间索引结构,首先基于四叉树对分区内的空间对象构建索引,将数据存储于叶子节点,其中叶子节点中的空间对象根据其所属的类别进行聚类并根据类别按序存储;
构建四叉树的同时根据四叉树的深度构建均匀网格索引,每个格网单元存储空间上相应位置叶子节点对象的指针或句柄;为了同时处理点、线以及面等不同数据类型,在索引过程中通过判断空间对象是否与叶节点所代表区域相交作为依据进行多副本索引。
9.根据权利要求8所述的一种基于Spark的空间矢量数据内存存储查询方法,其特征在于:在步骤S109中,所述的空间查询后封装为算子的过程,是对范围查询和KNN查询两种操作的封装,通过向算子传递查询条件作为参数可以执行查询任务,并将结果以RDD的形式进行返回,具体过程如下:
首先驱动程序根据空间数据的全局索引判断每个分区是否在查询条件范围内,选择可能存在满足条件数据的分区进一步判断;如果当前分区为buffer分区,根据全局索引和空间对象的Key值对数据进行过滤,在每个Key值对应的Bundle中选中目标类别的数据并执行遍历操作;其次,为了去除重复值,结果被存储到Set集合中;如果当前分区是非均匀网格分区,根据四叉网格索引中的网格索引进行数据的查询;最后,将每个分区的查询结果作为一个新的分区返回到结果RDD中,完成空间数据的封装。
10.根据权利要求9所述的一种基于Spark的空间矢量数据内存存储查询方法,其特征在于:在步骤S110,最终用户通过所述的查询模块调用对应的查询算子实现范围查询和KNN查询操作,具体包括:
A.空间查询:首先驱动程序根据全局索引判断与目标区域相交的分区,并将得到的分区ID进行广播;在每个待查询分区中判断当前分区的类型,如果为buffer分区,根据广播的ID列表筛选出所有前后缀在该列表中的Bundle,再对每个Bundle中的目标类别进行遍历筛选出满足条件的空间对象,然后将其存储到Set集合中;如果当前分区为四叉网格树分区,根据其中的网格索引对数据进行本地的范围查询,结果也以Set集合的形式进行存储;
B.KNN查询:初始化一个长度为K的队列用于存储最终结果,同时定义每个分区中查询的局部结果到查询点的最大和最小距离max/min_distance;在buffer分区和四叉网格索引分区中分别计算出本地KNN的结果列表,然后根据max/min_distance过滤其中不符合条件的分区,其原理为:对于一个结果列表S,如果存在另一个列表T,且T.max_distance<S.min_distance,则该结果列表一定不满足要求;因此直接过滤该结果列表,对于其他的结果列表,将其拉取到驱动程序节点,将队列进行归并得到最终结果。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110208391.6A CN112925789B (zh) | 2021-02-24 | 2021-02-24 | 一种基于Spark的空间矢量数据内存存储查询方法及*** |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110208391.6A CN112925789B (zh) | 2021-02-24 | 2021-02-24 | 一种基于Spark的空间矢量数据内存存储查询方法及*** |
Publications (2)
Publication Number | Publication Date |
---|---|
CN112925789A true CN112925789A (zh) | 2021-06-08 |
CN112925789B CN112925789B (zh) | 2022-12-20 |
Family
ID=76171644
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202110208391.6A Active CN112925789B (zh) | 2021-02-24 | 2021-02-24 | 一种基于Spark的空间矢量数据内存存储查询方法及*** |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN112925789B (zh) |
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113901087A (zh) * | 2021-10-12 | 2022-01-07 | 大连海事大学 | 空间大数据分区重复数据的剪枝方法 |
CN114443798A (zh) * | 2022-02-10 | 2022-05-06 | 数字广东网络建设有限公司 | 一种面向地理信息数据的分布式管理***及方法 |
CN114995772A (zh) * | 2022-08-08 | 2022-09-02 | 南京三百云信息科技有限公司 | 客户数据迁移存储方法及装置 |
CN115809360A (zh) * | 2023-02-08 | 2023-03-17 | 深圳大学 | 一种大规模时空流数据实时空间连接查询方法及相关设备 |
Citations (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20120024274A1 (en) * | 2010-07-30 | 2012-02-02 | Toyota Jidosha Kabushiki Kaisha | Inter-cylinder air/fuel ratio imbalance determination apparatus and inter-cylinder air/fuel ratio imbalance determination method |
CN106209989A (zh) * | 2016-06-29 | 2016-12-07 | 山东大学 | 基于spark平台的空间数据并行计算***及其方法 |
CN106528773A (zh) * | 2016-11-07 | 2017-03-22 | 山东首讯信息技术有限公司 | 一种基于Spark平台支持空间数据管理的图计算***及方法 |
CN106599190A (zh) * | 2016-12-14 | 2017-04-26 | 大连交通大学 | 基于云计算的动态Skyline查询方法 |
CN106777093A (zh) * | 2016-12-14 | 2017-05-31 | 大连大学 | 基于空间时序数据流应用的Skyline查询*** |
CN107818147A (zh) * | 2017-10-19 | 2018-03-20 | 大连大学 | 基于Voronoi图的分布式时空索引*** |
CN109739585A (zh) * | 2018-12-29 | 2019-05-10 | 广西交通科学研究院有限公司 | 基于spark集群并行化计算的交通拥堵点发现方法 |
CN109947904A (zh) * | 2019-03-22 | 2019-06-28 | 东北大学 | 一种基于Spark环境的偏好空间Skyline查询处理方法 |
CN110175175A (zh) * | 2019-05-29 | 2019-08-27 | 大连大学 | 一种基于spark的分布式空间二级索引与范围查询算法 |
CN110765130A (zh) * | 2019-09-25 | 2020-02-07 | 武汉大学 | 一种分布式环境下基于Ripley’s K函数的时空POI数据点模式分析方法 |
CN111563081A (zh) * | 2020-04-09 | 2020-08-21 | 农业农村部规划设计研究院 | 一种矢量要素并行计算方法、装置、存储介质及终端 |
-
2021
- 2021-02-24 CN CN202110208391.6A patent/CN112925789B/zh active Active
Patent Citations (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20120024274A1 (en) * | 2010-07-30 | 2012-02-02 | Toyota Jidosha Kabushiki Kaisha | Inter-cylinder air/fuel ratio imbalance determination apparatus and inter-cylinder air/fuel ratio imbalance determination method |
CN106209989A (zh) * | 2016-06-29 | 2016-12-07 | 山东大学 | 基于spark平台的空间数据并行计算***及其方法 |
CN106528773A (zh) * | 2016-11-07 | 2017-03-22 | 山东首讯信息技术有限公司 | 一种基于Spark平台支持空间数据管理的图计算***及方法 |
CN106599190A (zh) * | 2016-12-14 | 2017-04-26 | 大连交通大学 | 基于云计算的动态Skyline查询方法 |
CN106777093A (zh) * | 2016-12-14 | 2017-05-31 | 大连大学 | 基于空间时序数据流应用的Skyline查询*** |
CN107818147A (zh) * | 2017-10-19 | 2018-03-20 | 大连大学 | 基于Voronoi图的分布式时空索引*** |
CN109739585A (zh) * | 2018-12-29 | 2019-05-10 | 广西交通科学研究院有限公司 | 基于spark集群并行化计算的交通拥堵点发现方法 |
CN109947904A (zh) * | 2019-03-22 | 2019-06-28 | 东北大学 | 一种基于Spark环境的偏好空间Skyline查询处理方法 |
CN110175175A (zh) * | 2019-05-29 | 2019-08-27 | 大连大学 | 一种基于spark的分布式空间二级索引与范围查询算法 |
CN110765130A (zh) * | 2019-09-25 | 2020-02-07 | 武汉大学 | 一种分布式环境下基于Ripley’s K函数的时空POI数据点模式分析方法 |
CN111563081A (zh) * | 2020-04-09 | 2020-08-21 | 农业农村部规划设计研究院 | 一种矢量要素并行计算方法、装置、存储介质及终端 |
Non-Patent Citations (1)
Title |
---|
夏英 等: "Spark环境下基于网格索引的轨迹k近邻查询方法", 《重庆邮电大学学报(自然科学版)》 * |
Cited By (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113901087A (zh) * | 2021-10-12 | 2022-01-07 | 大连海事大学 | 空间大数据分区重复数据的剪枝方法 |
CN113901087B (zh) * | 2021-10-12 | 2024-05-10 | 大连海事大学 | 空间大数据分区重复数据的剪枝方法 |
CN114443798A (zh) * | 2022-02-10 | 2022-05-06 | 数字广东网络建设有限公司 | 一种面向地理信息数据的分布式管理***及方法 |
CN114443798B (zh) * | 2022-02-10 | 2024-07-05 | 数字广东网络建设有限公司 | 一种面向地理信息数据的分布式管理***及方法 |
CN114995772A (zh) * | 2022-08-08 | 2022-09-02 | 南京三百云信息科技有限公司 | 客户数据迁移存储方法及装置 |
CN115809360A (zh) * | 2023-02-08 | 2023-03-17 | 深圳大学 | 一种大规模时空流数据实时空间连接查询方法及相关设备 |
Also Published As
Publication number | Publication date |
---|---|
CN112925789B (zh) | 2022-12-20 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN112925789B (zh) | 一种基于Spark的空间矢量数据内存存储查询方法及*** | |
CN110147377B (zh) | 大规模空间数据环境下基于二级索引的通用查询方法 | |
CN106528773A (zh) | 一种基于Spark平台支持空间数据管理的图计算***及方法 | |
CN110175175B (zh) | 一种基于spark的分布式空间二级索引与范围查询算法 | |
JP2004518226A (ja) | データベースシステムおよびクエリオプティマイザ | |
CN113268557B (zh) | 一种适应显示导向型可视化分析的快速的空间索引方法 | |
CN109241159A (zh) | 一种数据立方体的分区查询方法、***及终端设备 | |
CN109299101B (zh) | 数据检索方法、装置、服务器和存储介质 | |
KR100419575B1 (ko) | 고차원 색인구조를 위한 벌크 로딩방법 | |
CN113407810B (zh) | 一种基于大数据的城市信息和服务集成***及方法 | |
Vu et al. | R*-grove: Balanced spatial partitioning for large-scale datasets | |
CN105138607B (zh) | 一种基于混合粒度分布式内存网格索引的knn查询方法 | |
CN101515284A (zh) | 一种基于离散网格的并行空间拓扑分析方法 | |
CN110990423B (zh) | Sql语句的执行方法、装置、设备和存储介质 | |
US20220215021A1 (en) | Data Query Method and Apparatus, Computing Device, and Storage Medium | |
CN110347676A (zh) | 基于关系r树的不确定性时态数据管理与查询方法 | |
CN110659286A (zh) | 基于弱平衡空间树动态空间索引方法及其存储介质、装置 | |
CN116090395A (zh) | 数据处理方法、数据结构的生成方法、查询方法 | |
CN112818010B (zh) | 数据库查询方法及装置 | |
Bachiega et al. | An architecture for cost optimization in the processing of big geospatial data in public cloud providers | |
Sangat et al. | Distributed ATrie Group Join: Towards Zero Network Cost | |
Abdelhafeez et al. | DDCEL: Efficient Distributed Doubly Connected Edge List for Large Spatial Networks | |
CN115794938B (zh) | 地理矢量线数据的可视化方法、装置和计算机设备 | |
CN115658737B (zh) | 大规模轨迹数据时空伴随者查询方法和*** | |
Karlsen et al. | An efficient representation of qualitative spatial information using bintrees |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |