一种SSTable文件数据处理方法及其系统的制作方法

文档序号:6363656阅读:124来源:国知局
专利名称:一种SSTable文件数据处理方法及其系统的制作方法
技术领域
本申请涉及通信技术领域,特别是涉及一种SSTable文件数据处理方法及其系统。
背景技术
SSTable (Sorted String Table,排序字符串表),其本质上是一种文件格式,用于存储有序的Key-Value数据到磁盘上,每个SSTable文件由多个块组成,一旦完成写入,不能修改,只能读取。目前在分布式数据库中常用SSTable的格式存储有序的Key-Value数据,Key-Value数据都以字符串形式存储,每个SSTable中包含许多行,一定数量的行构成一个块,每行包含一个主键(RowKey)和行数据,行数据一般包含若干列,每列以列名为主键Key,列值为Value。图1示出了一种SSTable文件的行数据存储格式。SSTable文件一般只支持稀疏存储格式。向SSTable文件写入行数据时,首先写入行主键,然后写入该行中列值不为空的列,列值为空的列不写入,不占用存储空间。这种稀疏存储方式,每行中包含的列数量不确定,并且相同的列名在不同的行中反复被存储多次,造成存储空间的浪费,特别是对行中列数量确定,且每行中大多数的列都不为空的应用。

发明内容
本申请实施例提供了一种基于SSTable文件格式的数据处理方法及其系统,用以解决现有SSTable文件数据存储机制浪费存储空间的问题。本申请实施例提供的一种SSTable文件数据处理方法中,SSTable文件中设置有架构表,其中定义有所述SSTable文件行数据的列顺序和列属性信息,该方法包括:读取待写入到SSTable文件的行数据;在SSTable文件中写入行主键,并根据所述SSTable文件的架构表中定义的行数据的列顺序和列属性信息,对应所述行主键写入读取到的行数据的各列数据。本申请实施例提供的另一种SSTable文件数据处理方法中,SSTable文件中设置有架构表,其中定义有所述SSTable文件行数据的列顺序和列属性信息,该方法包括:接收对SSTable文件的数据查询请求;根据所述SSTable文件中的架构表,查询所请求查询的列数据;返回查询响应,其中携带有查询到的列数据。本申请实施例提供的一种SSTable文件数据处理系统中,SSTable文件中设置有架构表,其中定义有所述SSTable文件行数据的列顺序和列属性信息,该系统包括:读取模块,用于读取待写入到SSTable文件的行数据;存储模块,用于在SSTable文件中写入行主键,并根据所述SSTable文件的架构表中定义的行数据的列顺序和列属性信息,对应所述行主键写入读取到的行数据的各列数据。
本申请实施例提供的一种SSTable文件数据处理系统中,SSTable文件中设置有架构表,其中定义有所述SSTable文件行数据的列顺序和列属性信息,该系统包括:接收模块,用于接收对SSTable文件的数据查询请求;查询模块,用于根据所述SSTable文件中的架构表,查询所请求查询的列数据;返回模块,用于返回查询响应,其中携带有查询到的列数据。本申请的上述实施例中,由于SSTable文件中设置有架构表,其中定义有所述SSTable文件行数据的列顺序和列属性信息,在对SSTable文件进行数据处理时,根据该架构表进行数据读写处理,从而实现了行数据的存储只需存储行主键和列值,列值按照架构表中规定的顺序进行存放,不必存储列名或列ID等信息,减少了存储数据量。


图1为现有技术中SSTable文件的行数据存储格式示意图;图2为本申请实施例提供的SSTable文件数据存储格式示意图;图3为本申请实施例提供的结构表的存储格式示意图;图4为本申请实施例提供的向SSTable文件写入数据的流程示意图;图5为本申请实施例提供的从SSTable文件读取数据的流程示意图;图6为本申请实施例提供的SSTable文件数据处理系统结构图之一;图7为本申请实施例提供的SSTable文件数据处理系统结构图之二 ;图8为本申请实施例提供的SSTable文件数据处理系统结构图之三。
具体实施例方式现有SSTable文件只支持稀疏格式存储,但许多情况下,业务数据其实是稠密的结构化数据,需要稠密格式存储。所谓稠密格式存储是指:存储行数据时,行中不为空的列存储该列值,为空的列,用空值对象填充,即行中的每列都要存储一个列值。比如,从数据库MySql或Oracle迁移过来的业务数据,每张表的列数量确定,列变更不频繁,表中大多数列都不为空,并且业务经常对整行进行读写。对于这种应用,采用现有SSTable文件的稀疏格式存储方式,将造成比较大的空间浪费,并且读写效率不高。为解决上述问题,本申请实施例对SSTable文件所使用的存储格式进行了改进,并相应改进了数据存储流程和数据查询流程。具体的,本申请实施例的SSTable文件存储格式中增加了结构表,用于描述行数据所包含的列,即,该结构表用于定义SSTable文件中行数据中各列的列顺序并进一步定义列属性信息。该结构表中可定义SSTable文件数据表的相关信息以及数据表中的行数据所包含的列的相关信息。如,结构表定义了表名、表ID,以及表中行数据所包含的列、列的顺序、每列的列名、列ID、列值的数据类型等。其中,列的顺序可用序列号标识出,也可通过结构表中各列的相关信息的排列顺序表不。参见图2,为本申请实施例提供的一种支持稠密存储方式的SSTable文件存储格式示意图。其中,SSTable文件使用块保存有序的Key-Value数据,每个块的大小可以配置,一般每个块的大小在8KB 64KB之间。
整个SSTable文件按主键Key有序存储Key-Value数据,其中,Key为行主键,Value为行数据。行数据的存储支持稠密格式:行主键Key+列值数组。其中,行主键Key由行主键长度+行主键字符串组成,列值数组为该行全部列的值(value),其数量、顺序和数据类型由SSTable文件的结构表定义,包括空值对象,但不包含列名或列ID等列属性信息。对于为空的列值,以空值对象填充,从而保证每行中的列顺序和列数据与结构表中的定义保持一致。结构表头部保存了整个结构表中列的数量,结构表主要定义每行的列顺序和列的一些属性,比如表ID、列ID、列值的数据类型(如整型、字符串型)等,每行中存储的列数据与结构表中定义的列顺序和列的其它属性保持一致。结构表的存储格式的参考实现可如图3所示。其中,结构表头部(结构表Header)记录了整个结构表中列的数量;结构表中存储了多个表信息,Column Definition定义了列所属的表ID,以及列ID和列值类型,列值类型包括数值、字符串、时间等;所有表的结构表存储在一起,整个Column Definition数组按(表ID,列ID)顺序存储。优选的,每个块内还可以建立行索引,行索引记录了每行在块中的起始位置。行索引可以是一个包含了(行数量+1)个元素的数组,每个元素是一个int型(整型)数值,记录了每行行首相对于所在块起始点的相对偏移值。最后一个元素指向最后一行的尾部,由于没有保存每行的长度,需要相邻的行的起始位置相减来获得行长度,这样设计是为了节省存储空间。当然,行索引的形式并不仅限于此,凡是能够标识行数据在其所在块中的位置,能够索引到行数据的索引数据形式,都应包含在本申请的保护范围内。由于在块内建立了行索引,在数据检索时,可以使用二分查找在块内部迅速定位某个Key ;而现有的SSTable文件不支持块内建行索引,在数据检索时需要在块内遍历查询。可见,本申请实施例通过行索引可提高数据检索效率。块头部中存储了块的行数量,在块内建立行索引的情况下,还可以存储行索引的
位置等信息。通过本申请实施例提供的SSTable文件存储格式可以看出,行数据的存储只需存储行主键和列值数组,列值按照结构表中规定的顺序进行存放,不必存储列名或列ID,减少了存储数据量。基于本申请实施例提供的SSTable文件存储格式,在向SSTable文件写入数据时,以整行为单位写入。每写入一行时,首先写入行主键,然后根据SSTable文件的结构表中定义的行数据的列顺序和列属性信息,对应该行主键写入该行数据的各列数据,写入的列数据中不包括列的属性信息(如列名、列ID等)。每个行数据以稠密格式存储:行主键Key+列值数组,对于为空的列值,以空值对象填充。具体的,在写入一行数据的过程中,写入行主键后,对应该行主键,按照SSTable文件的结构表中定义的列顺序,写入读取到的行数据的各列数据,写入的行数据中各列数据的顺序,与结构表中定义的列顺序一致;其中,若待写入的列数据的列属性与结构表中定义的相应列的列属性不一致,则当前行数据写入失败。进一步的,在完成一条行数据的写入之后,针对其所在的块建立行索引,行索引用于标识该行数据在该块中的位置,如该行索引为该行数据在该块中的起始位置。基于以上数据存储原则,图4示出了本申请实施例提供的一种向SSTable文件写入数据的流程,该流程仅为本申请实施例的一种具体实现,凡是能够体现上述原则的流程均应在本申请的保护范围之内。如图4所示,当读取到待写入SSTable文件的行数据后,该流程可包括:步骤401,判断是否所有行数据已写完,若是,转入步骤406 ;否则,转入步骤402 ;步骤402,写入行主键,转入步骤403 ;步骤403,判断本行数据是否已写完,若是,则转入步骤401 ;否则,转入步骤404 ;步骤404,根据SSTable文件的结构表所定义的列,对当前行的当前列进行检验,即是否与结构表的定义一致,若检验通过,若检验通过,则转入步骤405 ;否则,当前行写入失败,流程结束;其中,若当前列的属性与结构表定义的列属性一致,则可认为检验通过。例如,当前列的数据类型与结构表的定义一致,则当前列检验通过;又例如,当前列在待写入行数据中的位置与结构表定义的列顺序一致,则当前列检验通过。通过该方式可以实现对待写入数据的强制校验,以避免错误数据写入SSTable文件。步骤405,向SSTable文件写入当前列数据,然后转入步骤403 ;步骤406,向SSTable文件写入元数据,然后结束本次写数据流程。其中,本申请实施例中的元数据定义可与现有技术中的定义一致。通过本申请实施例提供的向SSTable文件写入数据的流程可以看出,在向SSTable文件写入数据过程中,可以按照原有的数据类型写入Key-Value,返回的数据也是其本身的数据类型,不需进行“字符串_>数值”或“数值_>字符串”的转换,方便了业务使用,缩短了操作时间,提高了写操作效率。写入过程中还可以根据结构表做强制类型校验,以避免将错误数据写入SSTable,提高了数据写入的准确性。基于本申请实施例提供的SSTable文件存储格式,从SSTable查询所需的列数据时,首先从SSTable中读取结构表,根据该结构表查询所请求查询的列数据。具体的,根据结构表查询所请求查询的列数据的过程中,可首先读取整行数据,然后根据结构表和所请求查询的列信息,再从整行数据中过滤出所要查询的列数据。进一步的,根据结构表查询所请求查询的列数据的过程中,在过滤出所要查询的列数据之后,判断该列数据是否与结构表中定义的相应列的属性(如列值的数据类型)一致,若一致,则将查询到的列数据作为查询结果,否则,本次查询失败,终止查询。对于查询的列在结构表不存在的情况,可以根据应用需求处理。进一步的,在查询到所请求查询的列数据之后,还可根据结构表所定义的列属性(如列值的数据类型),对查询到的列数据进行统计或分析处理。由于结构表中包含了列的数据类型信息,在查询的时候可以方便地根据数据类型,对数据进行过滤和分析,比如只返回修改时间为某个时间点以后的数据。基于以上数据查询原则,图4示出了本申请实施例提供的一种从SSTable文件查询数据的流程,该流程仅为本申请实施例的一种具体实现,凡是能够体现上述原则的流程均应在本申请的保护范围之内。如图5所示,当接收到对SSTable文件的数据进行查询的请求后,该流程可包括:步骤501,读取SSTable文件中的结构表;步骤502,根据读取到的结构表对请求查询的列进行检验,即,判断所请求查询的列是否与结构表一致,若检验通过,则转入步骤503,否则结束本次查询流程;步骤503,判断所请求查询的行数据是否已经读取完成,若是,则结束本次查询流程,否则转入步骤504;步骤504,读入一行数据并遍历列;其中,在读入行数据时,可根据行索引快速定位到行数据进行读取;步骤505,判断列数据是否已经遍历完成,若是,则转入步骤503,否则转入步骤506 ;步骤506,遍历下一列;步骤507,根据查询请求判断当前遍历到的列数据是否需要返回,若是,则转入步骤508,否则转入步骤505;其中,若当前遍历到的列数据是请求查询的列,则需要返回。步骤508,将所请求查询的列数据写入到输出队列准备作为查询结果输出,并转入步骤505。通过本申请实施例提供的从SSTable文件查询数据的流程可以看出,读取整行时,直接返回列值数组,即使只是读取行中的某些列,可以将整行读出再做过滤,以得到所请求查询的列数据。由于这种稠密存储方式存储的总数据量比稀疏格式存储的数据量小,所以即使进行过滤也会更高效。另外,SSTable的数据查询流程中根据结构表进行强制校验,从而保证列数据与结构表的一致性。基于相同的技术构思,本申请实施例还提供了一种SSTable文件数据处理系统。参见图6,为本申请实施例提供的SSTable文件数据处理系统的结构示意图,其中,SSTable文件中设置有架构表,其中定义有所述SSTable文件行数据的列顺序和列属性信息,该系统包括:读取模块601,用于读取待写入到SSTable文件的行数据;存储模块602,用于在SSTable文件中写入行主键,并根据所述SSTable文件的架构表中定义的行数据的列顺序和列属性信息,对应所述行主键写入读取到的行数据的各列数据。具体的,存储模块601在存储行数据时,对应所述行主键,按照SSTable文件的架构表中定义的所述SSTable文件行数据的列顺序,写入读取到的行数据的各列数据;其中,若待写入的列数据的列属性与所述架构表中定义的相应列的列属性不一致,则当前行数据写入失败。具体的,存储模块601在写入读取到的行数据的各列数据的过程中,对于为空的列,写入空值对象。进一步的,存储模块601写入行数据后,针对所述行数据所在的块,创建所述行数据的行索引,所述行索引用于标识所述行数据在该块中的位置。参见图7,为本申请另一实施例提供的SSTable文件数据处理系统的结构示意图。其中,SSTable文件中设置有架构表,其中定义有所述SSTable文件行数据的列顺序和列属性信息,该系统包括:接收模块701,用于接收对SSTable文件的数据查询请求;查询模块702,用于根据所述SSTable文件中的架构表,查询所请求查询的列数据;
返回模块703,用于返回查询响应,其中携带有查询到的列数据。具体的,查询模块702在查询数据的过程中,根据所述SSTable文件中的架构表和所请求查询的列信息,读取目标行数据中相应列的数据;判断读取到的列数据的属性是否与所述架构表中定义的相应列的属性一致,若一致,则将查询到的列数据作为查询结果,否贝U,本次查询失败。进一步的,该系统还可包括分析处理模块704,用于在查询模块702查询到所请求查询的列数据之后,根据所述SSTable文件中的架构表所定义的列属性,对查询到的列数据进行统计或分析处理。具体的,所述SSTable文件中还包括行索引信息,所述行索引用于标识行数据在其所在块中的位置。相应的,查询模块702可在根据SSTable文件中的架构表,查询所请求查询的列数据之前,根据所述行索引信息确定目标行数据的位置,并根据确定出的位置读取相应行数据。如图8所示,在具体实施时,SSTable文件数据处理系统通常包含图6和图7所示的功能模块,即,SSTable文件数据处理系统通常既能够实现数据的存储,又能够实现数据的查询。综上所述,本申请实施例的SSTable存储格式中包含了类似关系数据库的结构表,结构表中定义了表名,表ID,表中行包含的列,列的顺序,每列的列名,列ID,列值类型等;行数据的存储只需存储行主键和列值数组,列值按照结构表中规定的顺序进行存放,不必存储列名或列ID,减少了存储数据量;写入时以整行为单位,可以根据结构表定义的列顺序等信息做强制校验,避免错误数据写入SSTable ;读取整行时,直接返回列值数组,即使只是读取行中的某些列,可以将整行读出再做过滤。由于这种稠密存储方式存储的总数据量比稀疏格式存储的数据量小,所以即使做过滤也会更高效。SSTable支持稠密存储格式的读与,对基于整行读与的应用,是简单闻效的解决方案。应该认识到,本申请系统的各个模块可以集成于一体,也可以分离部署。上述模块可以合并为一个模块,也可以进一步拆分成多个子模块。通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到本申请可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本申请各个实施例所述的方法。本领域技术人员可以理解附图只是一个优选实施例的示意图,附图中的模块或流程并不一定是实施本申请所必须的。以上所述仅是本申请的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本申请原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视本申请的保护范围。
权利要求
1.一种排序字符串表SSTable文件数据处理方法,其特征在于,SSTable文件中设置有架构表,其中定义有所述SSTable文件行数据的列顺序和列属性信息,该方法包括: 读取待写入到SSTable文件的行数据; 在SSTable文件中写入行主键,并根据所述SSTable文件的架构表中定义的行数据的列顺序和列属性信息,对应所述行主键写入读取到的行数据的各列数据。
2.如权利要求1所述的方法,其特征在于,所述根据SSTable文件的架构表中定义的行数据的列顺序和列属性信息,对应所述行主键写入读取到的行数据的各列数据,包括: 对应所述行主键,按照SSTable文件的架构表中定义的所述SSTable文件行数据的列顺序,写入读取到的行数据的各列数据;其中,若待写入的列数据的列属性与所述架构表中定义的相应列的列属性不一 致,则当前行数据写入失败。
3.如权利要求1所述的方法,其特征在于,在写入读取到的行数据的各列数据的过程中,对于为空的列,写入空值对象。
4.如权利要求1所述的方法,其特征在于,写入行数据后还包括: 针对所述行数据所在的块,创建所述行数据的行索引,所述行索引用于标识所述行数据在该块中的位置。
5.一种排序字符串表SSTable文件数据处理方法,其特征在于,SSTable文件中设置有架构表,其中定义有所述SSTable文件行数据的列顺序和列属性信息,该方法包括: 接收对SSTable文件的数据查询请求; 根据所述SSTable文件中的架构表,查询所请求查询的列数据; 返回查询响应,其中携带有查询到的列数据。
6.如权利要求5所述的方法,其特征在于,所述根据SSTable文件中的架构表,查询所请求查询的列数据,包括: 根据所述SSTable文件中的架构表和所请求查询的列信息,读取目标行数据中相应列的数据; 判断读取到的列数据的属性是否与所述架构表中定义的相应列的属性一致,若一致,则将查询到的列数据作为查询结果,否则,本次查询失败。
7.如权利要求5所述的方法,其特征在于,在查询到所请求查询的列数据之后,还包括:根据所述SSTable文件中的架构表所定义的列属性,对查询到的列数据进行统计或分析处理。
8.如权利要求5-7之任一所述的方法,其特征在于,所述SSTable文件中还包括行索引信息,所述行索引用于标识行数据在其所在块中的位置; 所述根据SSTable文件中的架构表,查询所请求查询的列数据之前,还包括:根据所述行索引信息确定目标行数据的位置,并根据确定出的位置读取相应行数据。
9.一种排序字符串表SSTable文件数据处理系统,其特征在于,SSTable文件中设置有架构表,其中定义有所述SSTable文件行数据的列顺序和列属性信息,该系统包括: 读取模块,用于读取待写入到SSTable文件的行数据; 存储模块,用于在SSTable文件中写入行主键,并根据所述SSTable文件的架构表中定义的行数据的列顺序和列属性信息,对应所述行主键写入读取到的行数据的各列数据。
10.一种排序字符串表SSTable文件数据处理系统,其特征在于,SSTable文件中设置有架构表,其中定义有所述SSTable文件行数据的列顺序和列属性信息,该系统包括: 接收模块,用于接收对SSTable文件的数据查询请求; 查询模块,用于根据所述SSTable文件中的架构表,查询所请求查询的列数据; 返回模块, 用于返回查询响应,其中携带有查询到的列数据。
全文摘要
本申请公开了一种SSTable文件数据处理方法及其系统,其中,SSTable文件中设置有架构表,其中定义有所述SSTable文件行数据的列顺序和列属性信息,该方法包括读取待写入到SSTable文件的行数据;在SSTable文件中写入行主键,并根据所述SSTable文件的架构表中定义的行数据的列顺序和列属性信息,对应所述行主键写入读取到的行数据的各列数据。采用本申请在对SSTable文件进行数据处理时,根据该架构表进行数据读写处理,从而实现了行数据的存储只需存储行主键和列值,列值按照架构表中规定的顺序进行存放,不必存储列名或列ID等信息,减少了存储数据量。
文档编号G06F17/30GK103218365SQ20121001850
公开日2013年7月24日 申请日期2012年1月20日 优先权日2012年1月20日
发明者庄明强 申请人:阿里巴巴集团控股有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1