发明内容
为了解决现有技术的问题,本发明实施例提供了一种数据交换系统的任务拆分方法及装置,以克服现有技术中不会根据数据量大小动态的设置数据分配策略等问题。
为解决上述一个或多个技术问题,本发明采用的技术方案是:
一方面,提供了一种数据交换系统的任务拆分方法,该方法包括如下步骤:
判断当前任务的数据表中待交换数据的数据源的类型,若所述数据源是关系数据库,则根据所述待交换数据的类型选择相应的查询语句;
解析所述查询语句,根据解析结果判定所述查询语句的复杂度;
若所述复杂度满足预设条件,则查询所述待交换数据的数据量;
根据所述待交换数据的数据量,从预设的拆分策略中选取对应的拆分策略,所述预设的拆分策略包括分页拆分策略、主键字段拆分策略和不拆分策略;
根据选取的所述拆分策略对所述当前任务进行拆分。
进一步的,所述解析所述查询语句的,根据解析结果判定所述查询语句的复杂度包括:
解析所述查询语句,至少获取所述查询语句中的表关联次数以及分析函数个数,根据所述表关联次数和/或所述分析函数个数判定所述查询语句的复杂度。
进一步的,所述根据所述待交换数据的数据量,从预设的拆分策略中选取对应的拆分策略包括:
获取数据量阈值(n,m],其中n和m为正整数,且n<m,将所述待交换数据的数据量与所述数据量阈值进行比较,若所述数据表的数据量在所述数据量阈值范围内,则选取分页拆分策略,若所述数据表的数据量>m,则选取主键字段拆分策略,若所述数据表的数据量≤n,则选取不拆分策略。
进一步的,若拆分策略为分页拆分策略,则所述根据选取的所述拆分策略对所述当前任务进行拆分包括:
根据所述待交换数据的数据量设置并发子任务的数量,将所述待交换数据按照所述并发子任务的数量进行等份拆分后分配至各并发子任务。
进一步的,若拆分策略为主键字段拆分策略,则所述根据选取的所述拆分策略对所述当前任务进行拆分包括:
查询所述当前任务的数据表的主键字段,获取所述主键字段中的最大值以及最小值;
设置并发子任务个数,根据所述并发子任务个数、所述最大值以及所述最小值计算得到步长;
根据所述步长对所述当前任务的数据表进行拆分,将拆分得到的子数据表分配至各并发子任务。
进一步的,若查询到的所述当前任务的数据表的主键字段为字符类型的主键字段,则所述根据选取的所述拆分策略对所述当前任务进行拆分包括:
将所述字符类型的主键字段转换成Ascii码数值类型,设置主键字段中各个字段的权重后根据所述权重计算得到所述Ascii码的值;
将所述Ascii码的值转换成新的字符串,若所述新的字符串的长度大于1,则获取并发子任务个数;
按照所述并发子任务个数从左向右截取所述新的字符串,对所述当前任务的数据表进行拆分,将拆分得到的子数据表分配至各并发子任务。
进一步的,所述方法还包括:
若查询到所述当前任务的数据表没有主键,则将预设的字段设置为主键字段。
进一步的,所述方法还包括:
若所述数据源是文件系统,则按照文件大小对当前任务包含的所有文件进行排序;
设置并发子任务个数,根据所述并发子任务个数对排序后的文件进行拆分,并将拆分后的文件分配至各并发子任务。
进一步的,所述方法还包括:
若所述复杂度不满足所述预设条件,则不对所述当前任务进行拆分。
另一方面,提供了一种数据交换系统的任务拆分装置,所述装置包括:
类型判断模块,用于当前任务的数据表中待交换数据的数据源的类型;
语句选取模块,用于若所述数据源是关系数据库,则根据所述待交换数据的类型选择相应的查询语句;
复杂度判定模块,用于解析所述查询语句,根据解析结果判定所述查询语句的复杂度;
数据量查询模块,用于若所述复杂度满足预设条件,则查询所述待交换数据的数据量;
策略选取模块,用于根据所述待交换数据的数据量,从预设的拆分策略中选取对应的拆分策略,所述预设的拆分策略包括分页拆分策略、主键字段拆分策略和不拆分策略;
任务拆分模块,用于根据选取的所述拆分策略对所述当前任务进行拆分。
进一步的,所述复杂度判定模块包括:
语句解析单元,用于解析所述查询语句,至少获取所述查询语句中的表关联次数以及分析函数个数;
复杂度判定单元,用于根据所述表关联次数和/或所述分析函数个数判定所述查询语句的复杂度。
进一步的,所述策略选取模块包括:
阈值获取单元,用于获取数据量阈值(n,m],其中n和m为正整数,且n<m;
数据比较单元,用于将所述待交换数据的数据量与所述数据量阈值进行比较;
策略选取单元,用于若所述数据表的数据量在所述数据量阈值范围内,则选取分页拆分策略,若所述数据表的数据量>m,则选取主键字段拆分策略,若所述数据表的数据量≤n,则选取不拆分策略。
进一步的,所述任务拆分模块包括:
数量设置单元,用于根据所述待交换数据的数据量设置并发子任务的数量;
任务拆分单元,用于将所述待交换数据按照所述并发子任务的数量进行等份拆分后分配至各并发子任务。
进一步的,所述任务拆分模块还包括:
主键查询单元,用于查询所述当前任务的数据表的主键字段,获取所述主键字段中的最大值以及最小值;
步长计算单元,用于设置并发子任务个数,根据所述并发子任务个数、所述最大值以及所述最小值计算得到步长;
所述任务拆分单元还用于根据所述步长对所述当前任务的数据表进行拆分,将拆分得到的子数据表分配至各并发子任务。
进一步的,所述任务拆分模块还包括:
第一转换单元,用于将所述字符类型的主键字段转换成Ascii码数值类型;
数值计算单元,用于设置主键字段中各个字段的权重后根据所述权重计算得到所述Ascii码的值;
第二转换单元,用于将所述Ascii码的值转换成新的字符串;
信息获取单元,用于若所述新的字符串的长度大于1,则获取并发子任务个数;
所述任务拆分单元还用于按照所述并发子任务个数从左向右截取所述新的字符串,对所述当前任务的数据表进行拆分,将拆分得到的子数据表分配至各并发子任务。
进一步的,所述任务拆分模块还包括:
主键设置单元,用于若查询到所述当前任务的数据表没有主键,则将预设的字段设置为主键字段。
进一步的,所述任务拆分模块还包括:
文件排序单元,用于若所述数据源是文件系统,则按照文件大小对当前任务包含的所有文件进行排序;
所述任务拆分单元还用于设置并发子任务个数,根据所述并发子任务个数对排序后的文件进行拆分,并将拆分后的文件分配至各并发子任务。
本发明实施例提供的技术方案带来的有益效果是:
本发明实施例提供的数据交换系统的任务拆分方法及装置,通过根据待交换数据对应的查询语句的复杂度判定是否对当前任务进行拆分,同时通过根据待交换数据的数据量从预设的拆分策略中选取对应的拆分策略,实现动态的对当前任务进行拆分,获取最优拆分效果。
具体实施方式
为使本发明的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
图1是根据一示例性实施例示出的数据交换系统的任务拆分方法的流程图,参照图1所示,该方法包括如下步骤:
S1:判断当前任务的数据表中待交换数据的数据源的类型,若所述数据源是关系数据库,则根据所述待交换数据的类型选择相应的查询语句。
具体的,本发明实施例提供的数据交换系统的任务拆分方法及装置,主要支持的数据源包括关系数据库(RDB)和分布式文件系统(HDFS),针对不同的数据源采用不同的任务拆分策略。关系数据库(Relational Database,RDB)就是基于关系模型的数据库,也叫关系型数据库。在计算机中,关系数据库是数据和数据库对象的集合。所谓数据库对象是指表、视图、存储过程、触发器等。关系数据库是由数据表和数据表之间的关系组成的。关系数据库的数据类型包括mysql、oracle等。因此,本发明实施例中,在对数据交换系统的当前任务进行拆分前,首先会判断当前任务的数据表中待交换数据的数据源的类型,然后根据不同的类型选取不同的拆分策略对当前任务进行拆分。当查询到数据源是关系数据库后,还需根据待交换数据的数据类型(如mysql、oracle等)选择相应的查询语句。这里需要说明的是,作为一种较优的实施方式,本发明实施例中,查询语句的语言采用结构化查询语言(即SQL)。
S2:解析所述查询语句,根据解析结果判定所述查询语句的复杂度。
具体的,本发明实施例中设置根据查询语句的复杂度决定是否对当前任务进行拆分,因此需要获取查询语句的复杂度。具体实施时,可以通过对查询语句进行解析判定查询语句的复杂度。其中,可以采用开源的druid的语法解析功能对查询语句进行查询。
这里需要说明的是,本发明实施例中,在解析查询语句前,会对查询语句的语法正确性进行校验,例如检查语句是否完整、语法是否正确等。若校验通过,则执行下一步骤,否则,返回对重新获取相应查询语句或者对获取到的查询语句进行修改后重新进行校验,直到校验通过。在对查询语句的正确性进行校验时,同样可以采用开源的druid。
S3:若所述复杂度满足预设条件,则查询所述待交换数据的数据量。
具体的,若是查询语句的复杂度满足预设条件,则需要对当前任务进行拆分。本发明实施例中,预设条件可以设定为查询语句的复杂度低。由于进行任务拆分时还需要考虑待交换数据的数据量(row count),因此在确认复杂度满足预设条件后,首先需要查询待交换数据的数据量。
S4:根据所述待交换数据的数据量,从预设的拆分策略中选取对应的拆分策略,所述预设的拆分策略包括分页拆分策略、主键字段拆分策略和不拆分策略。
具体的,本发明实施例中,会根据数据量大小预先设置对应的拆分策略,包括分页拆分策略、主键字段拆分策略和不拆分策略等。查询到待交换数据的数据量后,根据待交换数据的数据量,从预设的拆分策略中选取对应的拆分策略。
S5:根据选取的所述拆分策略对所述当前任务进行拆分。
具体的,拆分策略确定后,根据相应的拆分策略对当前任务进行拆分。
作为一种较优的实施方式,本发明实施例中,所述解析所述查询语句的,根据解析结果判定所述查询语句的复杂度包括:
解析所述查询语句,至少获取所述查询语句中的表关联次数以及分析函数个数,根据所述表关联次数和/或所述分析函数个数判定所述查询语句的复杂度。
具体的,查询语句的复杂度和表关联次数(relation count)、分析函数个数(analytic functions count)等因素相关。其中,在关系型数据库中,表的关联是一个非常重要的组成部分。表的关联是指数据库中的数据表与数据表之间使用相应的字段实现数据表的连接。使用这种连接,无须将相同的数据多次存储,这种连接在进行多表查询时非常重要。因此,解析查询语句时,至少获取查询语句中的表关联次数以及分析函数个数。然后根据表关联次数和/或分析函数个数判定查询语句的复杂度。本发明实施例中,设置若是表关联次数大于2次,或者分析函数个数大于1个,则判定查询语句的复杂度高,否则,判定查询语句的复杂度低。
作为一种较优的实施方式,本发明实施例中,所述根据所述待交换数据的数据量,从预设的拆分策略中选取对应的拆分策略包括:
获取数据量阈值(n,m],其中n和m为正整数,且n<m,将所述待交换数据的数据量与所述数据量阈值进行比较,若所述数据表的数据量在所述数据量阈值范围内,则选取分页拆分策略,若所述数据表的数据量>m,则选取主键字段拆分策略,若所述数据表的数据量≤n,则选取不拆分策略。
具体的,这里的数据量的阈值可以根据实际需求进行设置,这里对具体数值不做限定。但是,作为一种较优的实施方式,可以设置n=10000,m=1000000,将待交换数据的数据量与数据量阈值进行比较,若数据表的数据量在数据量阈值范围内,即数据量在区间(10000,1000000]内,则选取分页拆分策略,若数据表的数据量>m,即数据量大于1000000时,因为数据库的分页随着数据量的增加,性能会有非常明显的衰减,所以此种情况,分页拆分不再合适,此时选取主键字段拆分策略,若数据表的数据量≤n,即数据量小于10000时,数据量过小,可以不用进行拆分,因此选取不拆分策略。
作为一种较优的实施方式,本发明实施例中,若拆分策略为分页拆分策略,则所述根据选取的所述拆分策略对所述当前任务进行拆分包括:
根据所述待交换数据的数据量设置并发子任务的数量,将所述待交换数据按照所述并发子任务的数量进行等份拆分后分配至各并发子任务。
具体的,根据待交换数据的数据量设置并发子任务的数量,例如假设数据量为1000000,并发子任务的数量为10个,则将待交换数据按照1~100000,100001~200000……等份拆分为10份,然后将这10份数据分配至上述10个子任务。
图2是根据一示例性实施例示出的根据选取的主键字段拆分策略对当前任务进行拆分的流程图,参照图2所示,作为一种较优的实施方式,本发明实施例中,若拆分策略为主键字段拆分策略,则所述根据选取的所述拆分策略对所述当前任务进行拆分包括:
S101:查询所述当前任务的数据表的主键字段,获取所述主键字段中的最大值以及最小值。
具体的,查询数据表的主键字段,若是主键是联合主键,则默认选取第一个。主键的类型包括数值型、字符型等。若是查询到的主键的类型为数值型,则获取主键字段中的最大值和最小值。
S102:设置并发子任务个数,根据所述并发子任务个数、所述最大值以及所述最小值计算得到步长。
具体的,本发明实施例中,对并发子任务的数量不做限制,可以进行自定义,即用户可以根据实际需求设置并发子任务的数量。然后根据并发子任务的数量、最大值以及最小值计算步长。作为一种示例,计算步长时可以采用以下公式:步长=(最大值-最小值)/并发子任务的数量+1,其中步长需进行取整处理。例如,假设最大值max=5,最小值min=1,并发子任务的数量为3,则步长=(max-min)/并发子任务的数量+1=(5-1)/3+1=4/3+1,进行取整处理后,步长值为2。
S103:根据所述步长对所述当前任务的数据表进行拆分,将拆分得到的子数据表分配至各并发子任务。
具体的,根据步长对当前任务的数据表进行拆分,具体拆分时,按照主键值从小到大的顺序将数据表按照步长进行拆分,然后将得到的子数据表分配至各并发子任务。例如,假设最大值max=5,最小值min=1,并发子任务的数量为3,计算出步长=2,则将数据表按照步长拆分为[1,3),[3,4],(4,5]三个任务。
图3是根据一示例性实施例示出的根据字符型主键字段拆分策略对当前任务进行拆分的流程图,参照图3所示,作为一种较优的实施方式,本发明实施例中,若查询到的所述当前任务的数据表的主键字段为字符类型的主键字段,则所述根据选取的所述拆分策略对所述当前任务进行拆分包括:
S201:将所述字符类型的主键字段转换成Ascii码数值类型,设置主键字段中各个字段的权重后根据所述权重计算得到所述Ascii码的值。
具体的,作为一种示例,计算Ascii码的值可以采用以下公式:
其中,N
i表示Ascii码的值,i表示字符型主键字段中第i个字符。
S202:将所述Ascii码的值转换成新的字符串,若所述新的字符串的长度大于1,则获取并发子任务个数。
具体的,将上述步骤得到的Ascii码的值转换成新的字符串,若是新的字符串的长度≤1,则不需要对当前任务进行拆分,若是新的字符串的长度>1,则需要对当前任务进行拆分,此时需要先获取并发子任务个数。这里需要说明的是,本发明实施例中,对这里的并发子任务的数量同样不做限制,用户可以根据实际需求进行自定义。
S203:按照所述并发子任务个数从左向右截取所述新的字符串,对所述当前任务的数据表进行拆分,将拆分得到的子数据表分配至各并发子任务。
具体的,假设新的字符串的最大值max=g,最小值min=a,并发子任务个数为3。由于a、g的Ascii值分别为97、103,因此可以拆分为[97,99),[99,101),[101,103]三段,然后根据Ascii和字符串对应关系97->a、99->c、101->e、103->g,那么[97,99),[99,101),[101,103]表达式可以转换为表达式[a,c),[c,e),[e,g],即将数据表拆分成[a,c),[c,e),[e,g]三个区间后分配至各个子任务。
作为一种较优的实施方式,本发明实施例中,所述方法还包括:
若查询到所述当前任务的数据表没有主键,则将预设的字段设置为主键字段。
具体的,若当前任务的数据表没有主键,将预设的字段作为主键进行当前任务的拆分。本发明实施例中,对预设的字段不做限制,用户可以自行指定。
作为一种较优的实施方式,本发明实施例中,所述方法还包括:
若所述数据源是文件系统,则按照文件大小对当前任务包含的所有文件进行排序。
具体的,若是查询到数据源是文件系统(如分布式文件系统,HDFS),则上述拆分策略就不再适用。此时按照文件大小对当前任务包含的所有文件进行排序。具体排序时,可以采用从小到大的顺序进行排序。
设置并发子任务个数,根据所述并发子任务个数对排序后的文件进行拆分,并将拆分后的文件分配至各并发子任务。
具体的,这里的并发子任务个数不做限制,可以进行自定义,即用户可以根据实际需求设置并发子任务的数量。根据并发子任务个数对排序后的文件进行拆分,并将拆分后的文件分配至各并发子任务。比如有5个文件,需要分拆为3个文件,按照文件从小至大的顺序排列后为:1、4、2、5、3,则拆分为(1,4),(2,5),(3)三等份。
作为一种较优的实施方式,本发明实施例中,所述方法还包括:
若所述复杂度不满足所述预设条件,则不对所述当前任务进行拆分。
具体的,本发明实施例中,复杂度不满足所述预设条件是指复杂度高,如表关联次数大于2次,或者分析函数个数大于1个,此时则不对当前任务进行拆分。因为复杂高的查询语句即使不拆分就可能会对数据库造成比较大的压力,如果再次分拆,压力就会翻倍,所以此种场景不对当前任务进行拆分。
图4是根据一示例性实施例示出的数据交换系统的任务拆分装置的结构示意图,参照图4所示,该装置包括:
类型判断模块,用于当前任务的数据表中待交换数据的数据源的类型;
语句选取模块,用于若所述数据源是关系数据库,则根据所述待交换数据的类型选择相应的查询语句;
复杂度判定模块,用于解析所述查询语句,根据解析结果判定所述查询语句的复杂度;
数据量查询模块,用于若所述复杂度满足预设条件,则查询所述待交换数据的数据量;
策略选取模块,用于根据所述待交换数据的数据量,从预设的拆分策略中选取对应的拆分策略,所述预设的拆分策略包括分页拆分策略、主键字段拆分策略和不拆分策略;
任务拆分模块,用于根据选取的所述拆分策略对所述当前任务进行拆分。
作为一种较优的实施方式,本发明实施例中,所述复杂度判定模块包括:
语句解析单元,用于解析所述查询语句,至少获取所述查询语句中的表关联次数以及分析函数个数;
复杂度判定单元,用于根据所述表关联次数和/或所述分析函数个数判定所述查询语句的复杂度。
作为一种较优的实施方式,本发明实施例中,所述策略选取模块包括:
阈值获取单元,用于获取数据量阈值(n,m],其中n和m为正整数,且n<m;
数据比较单元,用于将所述待交换数据的数据量与所述数据量阈值进行比较;
策略选取单元,用于若所述数据表的数据量在所述数据量阈值范围内,则选取分页拆分策略,若所述数据表的数据量>m,则选取主键字段拆分策略,若所述数据表的数据量≤n,则选取不拆分策略。
作为一种较优的实施方式,本发明实施例中,所述任务拆分模块包括:
数量设置单元,用于根据所述待交换数据的数据量设置并发子任务的数量;
任务拆分单元,用于将所述待交换数据按照所述并发子任务的数量进行等份拆分后分配至各并发子任务。
作为一种较优的实施方式,本发明实施例中,所述任务拆分模块还包括:
主键查询单元,用于查询所述当前任务的数据表的主键字段,获取所述主键字段中的最大值以及最小值;
步长计算单元,用于设置并发子任务个数,根据所述并发子任务个数、所述最大值以及所述最小值计算得到步长;
所述任务拆分单元还用于根据所述步长对所述当前任务的数据表进行拆分,将拆分得到的子数据表分配至各并发子任务。
作为一种较优的实施方式,本发明实施例中,所述任务拆分模块还包括:
第一转换单元,用于将所述字符类型的主键字段转换成Ascii码数值类型;
数值计算单元,用于设置主键字段中各个字段的权重后根据所述权重计算得到所述Ascii码的值;
第二转换单元,用于将所述Ascii码的值转换成新的字符串;
信息获取单元,用于若所述新的字符串的长度大于1,则获取并发子任务个数;
所述任务拆分单元还用于按照所述并发子任务个数从左向右截取所述新的字符串,对所述当前任务的数据表进行拆分,将拆分得到的子数据表分配至各并发子任务。
作为一种较优的实施方式,本发明实施例中,所述任务拆分模块还包括:
主键设置单元,用于若查询到所述当前任务的数据表没有主键,则将预设的字段设置为主键字段。
作为一种较优的实施方式,本发明实施例中,所述任务拆分模块还包括:
文件排序单元,用于若所述数据源是文件系统,则按照文件大小对当前任务包含的所有文件进行排序;
所述任务拆分单元还用于设置并发子任务个数,根据所述并发子任务个数对排序后的文件进行拆分,并将拆分后的文件分配至各并发子任务。
综上所述,本发明实施例提供的技术方案带来的有益效果是:
本发明实施例提供的数据交换系统的任务拆分方法及装置,通过根据待交换数据对应的查询语句的复杂度判定是否对当前任务进行拆分,同时通过根据待交换数据的数据量从预设的拆分策略中选取对应的拆分策略,实现动态的对当前任务进行拆分,获取最优拆分效果。
需要说明的是:上述实施例提供的数据交换系统的任务拆分装置在触发任务拆分业务时,仅以上述各功能模块的划分进行举例说明,实际应用中,可以根据需要而将上述功能分配由不同的功能模块完成,即将装置的内部结构划分成不同的功能模块,以完成以上描述的全部或者部分功能。另外,上述实施例提供的数据交换系统的任务拆分装置与数据交换系统的任务拆分方法实施例属于同一构思,即该装置是基于该数据交换系统的任务拆分方法的,其具体实现过程详见方法实施例,这里不再赘述。
本领域普通技术人员可以理解实现上述实施例的全部或部分步骤可以通过硬件来完成,也可以通过程序来指令相关的硬件完成,所述的程序可以存储于一种计算机可读存储介质中,上述提到的存储介质可以是只读存储器,磁盘或光盘等。
以上所述仅为本发明的较佳实施例,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。