一种在基于HDFS的spark-sql大数据处理系统上建立索引的方法

文档序号:9810620阅读:1310来源:国知局
一种在基于HDFS的spark-sql大数据处理系统上建立索引的方法【
技术领域
】[0001]本发明涉及一种在数据处理系统上建立索引的方法,尤其涉及一种在基于HDFS的spark-sql大数据处理系统上建立索引的方法。【
背景技术
】[0002]Spark-sql是在大数据处理平台spark的基础上,增加了支持标准sql查询语句的功能。[0003]Spark大数据处理平台是Berkeley所开源的类HadoopMapReduce的通用并行框架,它拥有HadoopMapReduce所具有的优点;但是Spark大数据处理程序的编写需要掌握scala语言,并且基于开放的API函数接口进行代码编写,繁琐而且复杂,并且大量的传统数据库开发人员所掌握的SQL语言无法在spark上使用。spark-sql的诞生解决了上述问题,它将传统的数据库表概念应用到spark处理框架,用户可以像操作传统数据库表那样,用sql语句建表和查询,spark-sql自动将相应操作转化为spark内部操作,屏蔽了复杂的处理细-K-TO[0004]但是由于spark大数据处理平台的特殊性,spark-sql不支持在数据表上建立索弓丨,即不支持类似于传统数据库的建立索引语句,例如:[0005]createindexmyindexontablet(b);[0006]意为:在表t的b列上建立名为myindex的一般索引。[0007]传统关系型数据库在接收到上述命令后,即开始为a表的c列建立索引。[0008]索引的类型有很多种,例如B-树索引,Hash索引,GiST索引,GIN索引等等。以B-树索引为例,关系型数据库建立索引原理如下:[0009]数据库开辟一块单独的存储区域,用来存储索引树。[0010]根据需要索引的列(例子中为名为b的列)中的字段生成B-树。并将此树保存到指定存储区域。其中B-树的每个节点对应b列中每个元素,另外每个节点中还包含一个指针,该指针记录了这个节点对应元素保存在数据库文件中的相应位置。[0011]当b列插入新元素时,也要将新元素插入B-树(B-树会自动调整),同时该树节点记录该元素在数据库文件中的位置。[0012]当b列删除元素时,也要将元素从B-树中删除(B-树会自动调整)。[0013]数据库索引基于数据库存储的实体文件,即上面所说的“数据库文件中的相应位置”,数据库文件可以根据需要自定义格式,所以数据在文件中的相应位置可以有不同表示方法,但总体思路都是记录了一个元素在文件中的确切位置,后续查找该元素时,不需要遍历文件,而可以借助这个已经记录的位置通过某种方法快速定位记录,从而达到加快查找的目的。[0014]如图1所示,数据文件对应表t,有a,b两列,其中b列建立了一个索引。即右边树结构的索引,索引中每个节点中的元素有指向数据文件相应元素位置的指针,其中索引本身也作为一个文件存储起来。[0015]当查询数据时,例如查询语句[0016]Select*fromtwhereb=22;[0017]表示查询表t中b列等于22的所有行。首先数据库先解析sql语句,然后发现b列存在索引。[0018]然后,直接从索引树中快速找到22元素,根据22元素的指针,定位到元素值为22的b列所在的行,其地址为0x90,然后直接根据地址,取出这一行,返回结果为“522”。[0019]当表t插入元素时,根据b列的值,会动态修改相应的索引树;相应的,当表t删除元素时,也会动态删减索引树中的内容。[0020]传统关系数据库的索引技术已经比较成熟,这里表述的是其一般原理,其实现方式多种多样,表现形式通常不固定,但基本原理都是相通的,其它索引的建立方法和实现步骤这里不再一一赘述。[0021]对于spark-sql,由于其底层的文件存储方式不同于传统关系型数据库(通常采用HDFS,而不是一般的Linux或Windows文件系统),而且通常一个表容量很大,一个表甚至会关联到成千上万个物理文件,所以spark-sql设计之时并没有创建索引的功能。其设计重点在于强调数据处理的并发能力而忽略了处理的效率问题。[0022]通常spark-sql进行数据查询时,会搜索整个数据表,通常spark-sql处理的数据量很大,一个数据库可能对应于多个物理文件,spark-sql会通过并发技术,对所有文件进行搜索。[0023]如图2所示,以同样的sql查询语句为例:[0024]Select*fromtwhereb=22;[0025]首先Spark-sql解析sql语句,然后定位到表t的数据文件(这里有4个文件)。然后将这几个文件根据特定大小拆分成多个块,分配给不同的工作进程处理,工作进程顺序扫描整个表包含的所有文件分块,找到b列值为22的行,找到之后,返回结果。[0026]可以看出,spark-sql在没有索引的情况下,进行表搜索的方式比较简单,存在效率低下,需要扫描全部的数据文件的所有行。[0027]除了简单的select语句,传统关系数据库在所有涉及到查询的地方包括复杂查询,子查询,嵌套查询等等都会应用索引技术,来减少查询量,加快查询速度,spark-sql没有这样的机制。[0028]综上所述,当前的spark-sql由于没有数据索引机制,无法使得查询速度达到最优,相比于传统关系型数据库,存在效率低下的问题。【
发明内容】[0029]本发明要解决的技术问题是提供一种在基于HDFS的spark-sql大数据处理系统上建立索引的方法,该方法可以使spark-sql适应于更多、更灵活的应用场景,加快spark-sql执行sql语句进行查询的速度,提高spark-sql的执行效率,更充分地发挥spark-sql处理大数据能力的优势。[0030]为了解决上述技术问题,本发明提供了一种在基于HDFS的spark-sql大数据处理系统上建立索引的方法,通过SQL语句在基于HDFS的spark-sql大数据处理系统上增加索引,删除索引,插入数据,删除数据,在数据查询的时候,自动判断查询列是否存在索引,如果存在,则查找索引包含的文件块,过滤不需要查询的文件块。[0031]增加索引时,首先需要新增一个索引文件,索引文件的格式可以根据配置和其它指令设置,常用的有B-树、Hash索引等格式,然后遍历原有表中所有记录,确定每条记录所需要索引的列的值位于HDFS或其他文件系统中位置,再记录该记录的列值和对应的文件信息,写入索引树结构。循环遍历所有记录,以文件形式保存索引结构,最后更新表元数据信息,将新的索引信息写入表的元数据中,以备后续查询使用。[0032]删除某表某列的索引时,只需要定位到相应的索引文件将其删除,并更新表元数据信息,同时删除元数据中的索引信息即可。[0033]插入一条数据后,判断插入的数据是否涉及到索引,如果涉及索引,则需要调整相应的索引结构,将这条数据和它相关联的文件信息也加入到索引结构中去。[0034]在整个流程中,数据表增加数据流程沿用原流程不变,只在数据增加完成后,记录数据所在的文件名,根据此返回的文件名构造索引节点。[0035]删除一条数据后,判断删除的数据是否涉及到索引,如果涉及索引,则需要调整相应的索引结构,将这条数据关联的索引节点删除。[0036]在整个流程中,其中数据表删除当前第1页1 2 3 
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1