本发明属于数据处理及数据抽取技术领域,特别涉及一种并行化sql自动生成方法。
背景技术:
数据库这种形式的数据存储在诸多应用中已经成为必不可少的方式,常用数据库包括oracle、mysql、greenplum、hive等,是主流的数据集来源。对常见主流数据库的操作基本都涉及到结构化sql语言,sql在执行数据抽取中由于更贴合数据库底层的交互因此有高效性能,同时也具有简洁、易用的特点。
数据抽取作为数据处理和为后续建模的前置数据集工作,通常需要数据人员去手动书写大量的sql,即便sql已经具备了简洁易用的特点,但是sql书写和纠正语法错误的过程还是会耗费大量的时间和精力,而且重复的工作也很难复用,同时还需要处理不同数据库sql语言之间的细微差异达到语法兼容的目的。
目前现有的sql生成系统能够实现语法生成和纠错的内容,并能够从语法的角度对执行效率进行优化,并通过搭建数据库集群能在性能上提高sql的执行速度,但是传统的表与表的聚合还是存在表与表之间执行先后顺序的依赖,因此无法做到真正的并行化,并且也无法突破数据库对于单表列数的上限数量限制;另外,目前常规的多表数据聚合方式,仅支持同源数据库的多表聚合,倘若要对多种类型的数据库的表进行汇聚则需要进行数据的搬移,这种形式对于大数据量的表操作是非常费时的。
技术实现要素:
为解决上述问题,本发明的目的在于提供一种实现表与表之间的解耦并以此来达到sql的解耦、突破数据聚合中的最大列限制问题的一种并行化sql自动生成方法。
本发明的另一个目的在于提供一种sql执行效率更高、数据处理的结果准确、高效的一种并行化sql自动生成方法。
为实现上述目的,本发明的技术方案如下。
本发明一种并行化sql自动生成方法,其特征在于,该方法的具体步骤如下:
s1:依据一个以上的数据集的单表,并完成表与表之间树形关系结构的配置,获取表关系树,所述单表包括一个主表和一个以上的子表,所述表关系树包括上级表和下级表,上级表和下级表相对设置;
s2:在逻辑层面中每个单表对应一个虚拟表,每个虚拟表的实际物理存储包括一个以上的单表;在逻辑层面,虚拟表的设计可以认定为突破数据库的最大列数量限制,理论上无列数上限限制;
s3:将已配置的表关系树进行广度优先遍历,预解析出表关系树中每层树状结构的结构信息;
s4:生成总虚拟表中的单表对应的数据集的主id临时index表,所述主id临时index表包括主表的id形成的id列;此表将作为虚拟表底层单表最终结果数据行对齐的参考基准;
s5:针对每个虚拟表与其他虚拟表的关联关系信息,生成能够表达两两单表之间的关联关系的关联index表,所有关联index表上均针对关联关系字段建立索引;通过关联index表的建立,确定了两两单表之间的关联关系,上级表的约束条件通过筛选后的关联关系字段的自上而下的进行传递,并对每个关联index表与下一级虚拟表的关联字段建立索引提高后面环节的join操作速度;
s6:将所述关联index表广播到不同类型的数据库中,实现不同库中单表之间约束和关联关系的传递;通过将关联index表广播到其他数据库中实现将关联index表中包含的表之间的约束和关联关系搬移到其他数据库中,进而实现不同源数据库的数据关联,代替了传统数据关联过程中需要将整个表搬移到其他数据库的过程,节省了时间和空间的资源。
s7:根据关联index表和表关系树,每个子表对应的虚拟表均可通过该关联index表直接与主表对应的虚拟表进行关联,使每个子表的虚拟表可直接汇聚到该主表对应的虚拟表中,形成总虚拟表,并对总虚拟表进行排序;通过单表与单表之间关联index表以及表关系树的确立,方便实现将子表对应的虚拟表合并到主表对应的虚拟表中,实现逻辑层虚拟表的合并,每个子表对应的虚拟表在合并到主表对应的虚拟表的过程中是不相依赖的,所以可以同时进行相关操作,即实现了多表之间的并行化sql操作。通过预解析关联关系达到表于表之间的依赖关系的解耦,有效的提高了执行效率,突破了数据仓库自身限制,并在兼容主流类型数据仓库的同时还具有简洁易用的特点。
进一步地,所述步骤s1中的单表通过前端图形化界面快速配置数据集的数据源、选择相应的数据表、配置数据集的主id获得。通过前端图形化界面的方式能够快速的实现数据库表的建立,同时产生虚拟表,通过对单表与单表之间树形关系结构的配置,实现了各表之间关系树的建立,即获得表关系树。
进一步地,所述步骤s3中的结构信息包括关联字段、关联关系和汇聚函数。通过关联字段、关联关系和汇聚函数的获得,为关联index表的建立提供基础。
进一步地,所述步骤s5中的关联index表,对于表关系树中表关系出现上级表与下级表为一对一的情况,在关联index表生成中会提前识别并进行表关系的合并。当上级表与下级表的表关系为一对一时,可直接进行两个表的合并,该种方式避免后续对大数据量的临时结果表进行重复的sql操作,也进一步提升了sql效率也为数据库节约出临时表空间。
进一步地,所述步骤s7中,根据关联index表和表关系树,上级表为每个下级表单独产生一层以深度优先规则遍历得到的聚合路径,这个聚合路径包含上级表与下级表的关联信息(即上级表与下级表之间的关联index表信息),每个下级表均可通过该聚合路径直接与主表进行关联,当虚拟表中的子表与主表汇聚时,每个子表可通过该聚合路径直接汇聚到该主表对应的虚拟表中,无需依赖上级表汇聚后的中间表,方便快捷,且所有子表可同时不相依赖的进行汇聚操作,依赖性更低。用于后续对虚拟表的聚合操作。
进一步地,所述步骤s7中的虚拟表的聚合过程中,先通过关联index表对虚拟表中对应的单表进行数据的筛选和去重,同时生成临时结果表,并以此临时结果表对所有单表进行数据和关联index表的汇聚。其中,临时结果表为一个虚拟表,通过将所有单表的数据集汇聚到该临时结果表中,实现了总虚拟表总虚拟表的合并。此过程的分表并行化聚合方式不仅能有效的提高sql效率还避免了无关数据列的反复搬移,为数据库节约出临时表空间,同时后置环节表的数据汇聚不再依赖于前置表的结果表从而达到了解耦的目的。
进一步地,所述总虚拟表的排序过程包括以主id临时index表的id列进行排序、进行数据的行对齐。其中,该id列为主表id形成的id列,其中主表的id与该主id临时index表的id对应后,在总虚拟表的汇聚过程中,上级表会为每个下级表单独产生一层聚合路径,该聚合路径包含了上级表与每个下级表的关联关系。便于将子表对应的虚拟表汇聚到主表对应的虚拟表上,同时保证汇聚后的虚拟表中同一条数据在每个单表上面是对齐的。
进一步地,所述总虚拟表在汇聚期间,如果虚拟表的列数超过了当前数据库类型的单表最大列数限制时,会将虚拟表拆分为多个子表。
综上所述,对单表进行sql聚合操作时,利用单表对应的虚拟表,先获取虚拟表对应的单表与单表之间表关系树和关联index表,在表关系树中用上级表生成的关联index表对单表进行数据的筛选和去重,同时生成临时结果表,该临时结果表为虚拟表;以此临时结果表自下而上的对每个单表进行源数据和关联index表的汇聚,并最终以主id临时index表的id列进行排序、进行数据的行对齐;期间如果虚拟表的列数超过了当前类型数据库的单表最大列数限制,会将单表拆分为多个子表。综上实现了一个以上的虚拟表汇聚为一个总虚拟表的过程,此过程的分表并行化聚合方式不仅能有效的提高sql效率还避免了无关数据列的反复搬移,为数据库节约出临时表空间,同时后置环节表的数据汇聚不再依赖于前置表的结果表从而达到了解耦的目的。本发明实现可以自动化生成sql,通过预解析关联关系达到表于表之间的依赖关系的解耦,有效的提高了执行效率,突破了数据仓库自身限制,并在兼容主流类型数据仓库的同时还具有简洁易用的特点。
附图说明
图1是本发明的一种并行化sql自动生成方法的主表application_train。
图2是本发明的一种并行化sql自动生成方法的子表bureau。
图3是本发明的一种并行化sql自动生成方法的子表bureau_balance。
图4是本发明的一种并行化sql自动生成方法的主id临时index表。
图5是本发明的一种并行化sql自动生成方法的主表application_train与子表bureau的关联index表。
图6是本发明的一种并行化sql自动生成方法的子表bureau与子表bureau_balance的关联index表。
图7是本发明的一种并行化sql自动生成方法的主表application_train汇聚到主id临时index表后的表。
图8-9是本发明的一种并行化sql自动生成方法的子表bureau中数据集去重后与图5的关联index表的关联后的表。
图10是本发明的一种并行化sql自动生成方法的子表bureau_balance的数据集去重后的表。
图11-12首尾依次拼接后是本发明的一种并行化sql自动生成方法的子表bureau_balance与图6的关联index表的关联后的表。
图13-20首尾依次拼接后是本发明的一种并行化sql自动生成方法的图11-12产生的表与图5的关联index表的关联后的表。
图21-31首尾依次拼接后是本发明的一种并行化sql自动生成方法的主表application_train、子表bureau和子表bureau_balance汇聚后的总虚拟表。
图32是本发明的一种并行化sql自动生成方法的流程框图。
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
为实现上述目的,本发明的技术方案如下。
参照图1-32,本发明是一种并行化sql自动生成方法,其特征在于,该方法的具体步骤如下:
参照图1-3和图32,s1:依据一个以上的数据集的单表,并完成表与表之间树形关系结构的配置,获取表关系树,所述单表包括一个主表和一个以上的子表,所述表关系树包括上级表和下级表,上级表和下级表相对设置;
参照图32,s2:在逻辑层面中每个单表对应一个虚拟表,每个虚拟表的实际物理存储包括一个以上的单表;在逻辑层面,虚拟表的设计可以认定为突破数据库的最大列数量限制,理论上无列数上限限制;
参照图32,s3:将已配置的表关系树进行广度优先遍历,预解析出表关系树中每层树状结构的结构信息;
参照图1、图4和图32,s4:生成总虚拟表总虚拟表中的单表对应的数据集的主id临时index表,所述主id临时index表包括主表的id形成的id列;此表将作为虚拟表底层单表最终结果数据行对齐的参考基准;
参照图1-图7和图32,s5:针对每个虚拟表对应的结构信息,生成能够表达两两单表之间的关联关系的关联index表,所有关联index表上均针对关联关系字段建立索引;通过关联index表的建立,确定了两两单表之间的关联关系,上级表的约束条件通过筛选后的关联关系字段的自上而下的进行传递,并对每个关联index表与下一级虚拟表的关联字段建立索引提高后面环节的join操作速度;
参照图32,s6:将所述关联index表广播到不同类型的数据库中,实现不同库中单表之间约束和关联关系的传递;通过将关联index表广播到其他数据库中实现将关联index表中包含的表之间的约束和关联关系搬移到其他数据库中,进而实现不同源数据库的数据关联,代替了传统数据关联过程中需要将整个表搬移到其他数据库的过程,节省了时间和空间的资源。
参照图1-32,s7:根据关联index表和表关系树,每个子表对应的虚拟表均可通过该关联index表直接与主表对应的虚拟表进行关联,使每个子表的虚拟表可直接汇聚到该主表对应的虚拟表中,形成总虚拟表,并对总虚拟表进行排序;通过单表与单表之间关联index表以及表关系树的确立,方便实现将子表对应的虚拟表合并到主表对应的虚拟表中,实现逻辑层虚拟表的合并,每个子表对应的虚拟表在合并到主表对应的虚拟表的过程中是不相依赖的,所以可以同时进行相关操作,即实现了多表之间的并行化sql操作。其中,子表对应的虚拟表在汇聚过程中是并行化执行的,例如:主表application_train、子表bureau和子表bureau_balance,其中,主表application_train与子表bureau存在关联关系,子表bureau与子表bureau_balance存在关联关系,传统方式在进行主表application_train与子表bureau_balance关联时,需要将主表application_train与子表bureau关联后形成的中间表(主表application_train与子表bureau关联后的总表),将关联后的中间表与子表bureau_balance进行关联,这种方式需要将主表application_train与子表bureau关联后的总表与子表bureau_balance进行关联,较为麻烦,而本方式中的关联index表为仅包主表application_train与子表bureau的关联关系的字段,确定该关联index表后,子表bureau_balance可以直接通过该关联index表与主表application_train进行关联,同样的方式,所有的子表均可通过相应的关联index表与主表application_train进行同时的关联,即并行化实现子表与主表的关联,即实现多表甚至多种数据库的并行化执行sql操作。此过程的分表并行化聚合方式不仅能有效的提高sql效率还避免了无关数据列的反复搬移(仅搬移关联index表数据列),为数据库节约出临时表空间。
本发明实现可以自动化生成sql,通过预解析关联关系达到表于表之间的依赖关系的解耦,有效的提高了执行效率,突破了数据仓库自身限制,并在兼容主流类型数据仓库的同时还具有简洁易用的特点。
在本实施例中,所述步骤s1中的单表通过前端图形化界面快速配置数据集的数据源、选择相应的数据表、配置数据集的主id获得。通过前端图形化界面的方式能够快速的实现数据库表的建立,同时产生虚拟表,通过对单表与单表之间树形关系结构的配置,实现了各表之间关系树的建立,即获得表关系树。
在本实施例中,所述步骤s3中的结构信息包括关联字段、关联关系和汇聚函数。通过关联字段、关联关系和汇聚函数的获得,为关联index表的建立提供基础。
在本实施例中,所述步骤s5中的关联index表,对于表关系树中表关系出现上级表与下级表为一对一的情况,在关联index表生成中会提前识别并进行表关系的合并。当上级表与下级表的表关系为一对一时,可直接进行两个表的合并,该种方式避免后续对大数据量的临时结果表进行重复的sql操作,也进一步提升了sql效率也为数据库节约出临时表空间。
在本实施例中,所述步骤s7中,根据关联index表和表关系树,上级表为每个下级表单独产生一层以深度优先规则遍历得到的聚合路径,这个聚合路径包含上级表与下级表的关联信息(即上级表与下级表之间的关联index表信息),每个下级表均可通过该聚合路径直接与主表进行关联,当虚拟表中的子表与主表汇聚时,每个子表可通过该聚合路径直接汇聚到该主表对应的虚拟表中,无需依赖上级表汇聚后的中间表,方便快捷,且所有子表可同时不相依赖的进行汇聚操作,依赖性更低。用于后续对虚拟表的聚合操作。其中,聚合路径优选为json的数据格式。
在本实施例中,所述步骤s7中的虚拟表的聚合过程中,先通过关联index表对虚拟表中对应的单表进行数据的筛选和去重,同时生成临时结果表,并以此临时结果表对所有单表进行数据和关联index表的汇聚。其中,临时结果表为一个虚拟表,通过将所有单表的数据集汇聚到该临时结果表中,实现了总虚拟表总虚拟表的合并。此过程的分表并行化聚合方式不仅能有效的提高sql效率还避免了无关数据列的反复搬移,为数据库节约出临时表空间,同时后置环节表的数据汇聚不再依赖于前置表的结果表从而达到了解耦的目的。其中,对单表进行数据的筛选和去重的方式优选为对单表的数据集进行分组(groupby)。
在本实施例中,所述总虚拟表的排序过程包括以主id临时index表的id列进行排序、进行数据的行对齐。其中,该id列为主表id形成的id列,其中主表的id与该主id临时index表的id对应后,将作为虚拟表底层单表最终结果数据行对齐的参考基准。便于将子表对应的虚拟表汇聚到主表对应的虚拟表上,同时保证汇聚后的虚拟表中同一条数据在每个单表上面是对齐的。
在本实施例中,所述总虚拟表在汇聚期间,如果虚拟表的列数超过了当前数据库类型的单表最大列数限制时,会将虚拟表拆分为多个子表。在逻辑层面,虚拟表的设计可以认定为突破数据库的最大列数量限制,理论上无列数上限限制。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。
1.一种并行化sql自动生成方法,其特征在于,该方法的具体步骤如下:
s1:依据一个以上的数据集的单表,并完成表与表之间树形关系结构的配置,获取表关系树,所述单表包括一个主表和一个以上的子表,所述表关系树包括上级表和下级表,上级表和下级表相对设置;
s2:在逻辑层面中每个单表对应一个虚拟表,每个虚拟表的实际物理存储包括一个以上的单表;
s3:将已配置的表关系树进行广度优先遍历,预解析出表关系树中每层树状结构的结构信息;
s4:生成总虚拟表中的单表对应的数据集的主id临时index表,所述主id临时index表包括主表的id形成的id列;
s5:针对每个虚拟表与其他虚拟表的关联关系信息,生成能够表达两两单表之间的关联关系的关联index表,所有关联index表上均针对关联关系字段建立索引;
s6:将所述关联index表广播到不同类型的数据仓库中,实现跨越不同数据仓库的单表之间约束和关联关系的传递;
s7:根据关联index表和表关系树,每个子表对应的虚拟表均可通过所述关联index表直接与主表对应的虚拟表进行关联,使每个子表的虚拟表可直接汇聚到该主表对应的虚拟表中,形成总虚拟表,并对总虚拟表进行排序。
2.如权利要求1所述的一种并行化sql自动生成方法,其特征在于,所述步骤s1中的单表通过前端图形化界面快速配置数据集的数据源、选择相应的数据表、配置数据集的主id获得。
3.如权利要求1所述的一种并行化sql自动生成方法,其特征在于,所述步骤s3中的结构信息包括关联字段、关联关系和汇聚函数。
4.如权利要求1所述的一种并行化sql自动生成方法,其特征在于,所述步骤s5中的关联index表,对于表关系树中表关系出现上级表与下级表为一对一的情况,在关联index表生成中会提前识别并进行表关系的合并。
5.如权利要求1所述的一种并行化sql自动生成方法,其特征在于,所述步骤s7中,根据关联index表和表关系树,上级表为每个下级表单独产生一层以深度优先规则遍历得到的聚合路径,这个聚合路径包含上级表与下级表的关联信息每个子表均可通过该聚合路径直接与主表进行关联。
6.如权利要求5所述的一种并行化sql自动生成方法,其特征在于,所述步骤s7中的虚拟表的聚合过程中,先通过关联index表对虚拟表中对应的单表进行数据的筛选和去重,同时生成临时结果表,并以此临时结果表对所有单表进行数据和关联index表的汇聚。
7.如权利要求6所述的一种并行化sql自动生成方法,其特征在于,所述总虚拟表的排序过程包括以主id临时index表的id列进行排序、进行数据的行对齐。
8.如权利要求7所述的一种并行化sql自动生成方法,其特征在于,所述总虚拟表在汇聚期间,如果虚拟表的列数超过了当前数据库类型的单表最大列数限制时,会将虚拟表拆分为多个子表。
技术总结