计算机设备的数据表,一种均匀切分数据库表数据的方法及计算机设备与流程

本发明涉及一种均匀切分数据库表数据的方法及计算机设备。

背景技术:

数据分区是分布式计算的重要内容:要求数据被比较均匀地分成多份再分配合适的计算资源,并且分区数通常是动态变化(如当前剩余的计算资源量、用户所能支配的资源量)。传统数据库表中数据一般未被分区(即使被分区也不是实际计算时所需要的分区数),提交计算任务时再进行分区,通常的做法要求扫描切分列的全部数据,加重数据库负担,并且由于切分列数值分布不均匀,简单的算法无法实施,复杂算法的实时性将受极大影响。

技术实现要素:

本发明要解决的技术问题,在于提供一种均匀切分数据库表数据的方法及计算机设备,以较低算法复杂度和数据库开销进行数据切分,较好地解决了数据库负担和快速分区的问题。

本发明之一是这样实现的:一种均匀切分数据库表数据的方法,包括:

步骤1、通过扫描所需切分的表,获取表中的列明、列类型以及索引状况;

步骤2、挑选出类型为整型且无重复值的列,若找不到对应列,则在该表中新添加一自增类型的列,该列作为切分列;否则任意选取一列作为切分列;

步骤3、设定预分区数M;

步骤4、读取切分列全部数值至数组,通过分位点算法计算该数组的M个分区区间,得到M个数值区间。

进一步地,还包括步骤5、将所述M个数值区间存入数据库或内存,并对外暴露服务接口,用于调用。

进一步地,所述步骤5进一步具体为:将所述M个数值区间存入数据库或内存,并对外暴露服务接口,用于调用;从应用程序获取将要分区的表以及实际分区数K,获取M个数值区间,将M个数值区间生成K个数值分区,并将K个数值分区返回给应用程序。

本发明之二是这样实现的:一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现以下步骤:

步骤1、通过扫描所需切分的表,获取表中的列明、列类型以及索引状况;

步骤2、挑选出类型为整型且无重复值的列,若找不到对应列,则在该表中新添加一自增类型的列,该列作为切分列;否则任意选取一列作为切分列;

步骤3、设定预分区数M;

步骤4、读取切分列全部数值至数组,通过分位点算法计算该数组的M个分区区间,得到M个数值区间。

进一步地,还包括步骤5、将所述M个数值区间存入数据库或内存,并对外暴露服务接口,用于调用。

进一步地,所述步骤5进一步具体为:将所述M个数值区间存入数据库或内存,并对外暴露服务接口,用于调用;从应用程序获取将要分区的表以及实际分区数K,获取M个数值区间,将M个数值区间生成K个数值分区,并将K个数值分区返回给应用程序。

本发明具有如下优点:

1)如果使用简单算法,由于“跳跃”现象导致切分不均匀,这将导致分布式计算某个计算节点的“崩溃”(处理太多数据而资源不足)或“木桶”效应(等待最慢的节点处理完毕);本发明算法可以避免不均匀问题。

2)如果直接使用较为复杂的算法,当计算任务很多时,表记录数很大或者表数目很多时,会对数据库造成很大压力;本发明预计算阶段请求数据库频繁程度很低不会对数据库造成压力。

3)此外,直接采用复杂算法还会对实时性响应造成很大影响;本发明实时计算阶段没有数据库开销,且运行简单算法可以满足实时性。

附图说明

下面参照附图结合实施例对本发明作进一步的说明。

图1为本发明方法执行流程图。

具体实施方式

本发明均匀切分数据库表数据的方法,包括:

步骤1、通过扫描所需切分的表,获取表中的列明、列类型以及索引状况;

步骤2、挑选出类型为整型且无重复值的列,若找不到对应列,则在该表中新添加一自增类型的列,该列作为切分列;否则任意选取一列作为切分列;

步骤3、设定预分区数M;

步骤4、读取切分列全部数值至数组,通过分位点算法计算该数组的M个分区区间,得到M个数值区间。

步骤5、将所述M个数值区间存入数据库或内存,并对外暴露服务接口,用于调用;从应用程序获取将要分区的表以及实际分区数K,获取M个数值区间,将M个数值区间生成K个数值分区,并将K个数值分区返回给应用程序。

本发明计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现以下步骤:

步骤1、通过扫描所需切分的表,获取表中的列明、列类型以及索引状况;

步骤2、挑选出类型为整型且无重复值的列,若找不到对应列,则在该表中新添加一自增类型的列,该列作为切分列;否则任意选取一列作为切分列;

步骤3、设定预分区数M;

步骤4、读取切分列全部数值至数组,通过分位点算法计算该数组的M个分区区间,得到M个数值区间。

步骤5、将所述M个数值区间存入数据库或内存,并对外暴露服务接口,用于调用;从应用程序获取将要分区的表以及实际分区数K,获取M个数值区间,将M个数值区间生成K个数值分区,并将K个数值分区返回给应用程序。

本发明实现的方法分两步走,预计算阶段扫描切分列全部数据,计算M分位点。实时计算部分再根据M分位点,实时算出分布式计算所需的K分位点。应用程序将K分位点转为K个数据库范围查询请求数据,从而将数据快速且比较均匀地分成K份。

如图1所示,方案结构:

离线切分系统,实时切分系统,应用程序,元数据系统

主要步骤:

A:预计算阶段(离线切分系统实施)

1)离线系统扫描数据库元数据系统,获取将要切分表的的列名、列类型和建索引状况,元数据库存储了所有已建索引的信息,包含字段是否被索引;

2)从1)所获取的列中挑选类型为整型(int)且无重复值的列。如果符合这类条件的列大于等于1列,则任取一个列作为切分列(假设为field_A)。并获取该列的最大值记为idmax和最小值记为idmin,(分区实质上是将不同记录(行)分成几组,无重复值的int类型的列很自然地起到“行号”的作用,虽然这种“行号”可能不连续。String、date等其他类型要起“行号”作用首先要转成int,其次还不能有重复值,很不便。对Int且无重复值的列建索引,在做区间查询时比较快)。

注:为后文描述方便,该列的任意一个值记为id。

3)如果2)找不到相应列,则在该表新添加一个自增类型(AUTO_INCREMENT)的列,起到“行号”的作用。

4)确定预分区数M,M可人为给定也可预先设定(数量级一般为104-105)

注:M值远大于实际需要的分区数K(K数量级101~103),但又远小于表的总记录数N(数量级为107~109或更大)。K受现实计算资源约束,因此不可能太大。而且过大还容易造成每个分区内数据太少,无法发挥批处理的优势。

5)确定预分区数M,M可人为给定也可预先设定(数量级一般为104-105)

注:M值远大于实际需要的分区数K(K数量级101~103),但又远小于表的总记录数N(数量级为107~109或更大)。K受现实计算资源约束,因此不可能太大。而且过大还容易造成每个分区内数据太少,无法发挥批处理的优势。

5)读取field_A列内全部数值到数组,调用分位点算法(记为alg_Q),计算该列的M个分区区间,得到M个数值区间I1=[min1,max1],…IM=[minM,maxM],满足如下要求:

i)每个区间内id值满足:区间最小值(如minM)≤id≤区间最大值(如maxM);

ii)每个区间数目近似相等(误差可控制在101~102内);

iii)min1=idmin(所有id的最小值),maxM=idmax(所有id的最大值)。

iv)对于任意1≤k≤M,区间Ik内的id值都小于区间Ik+1内的id值。

注1:alg_Q计算要求扫描field_A列全部数值,因为表的删除可能造成field_A的取值存在“跳跃”现象,如4,5,100,101,1000,1006,…,因此无法使用简单算法(alg_S)来获取M个数值区间。alg_Q具体实现很多,原则上可以任意调用一个满足5)中要求的i)-iii)的算法即可。

注2:假设idmin按自然数增长幅度(+1)递增到idmax。可用简单算法alg_S进行区间等分划分,I1=[idmin,idmin+Δ],I2=[idmin+Δ+1,idmin+2Δ],…IM=[maxM-Δ+1,maxM],其中Δ=(idmax-idmin)/M。

6)将该表的M个分区区间存入数据库或内存,对外暴露服务接口,方便在线切分系统调用。

注:1)至4)原则上只要首次预计算时进行即可,除非遇到表结构变化。5)至6)可设置每天/周定时执行一次或视数据记录增长快慢灵活把握。

B:实时计算阶段(实时切分系统实施)

1)实时切分系统从应用程序获取将要分区的表和实际分区值K。

2)实时切分系统访问离线系统中已生成的分区表的M个分区区间。

3)实时切分系统调用简单算法(alg_S),快速从M个分区区间中生成K个分区区间。

4)实时切分系统将K个分区区间返回给应用程序。

虽然以上描述了本发明的具体实施方式,但是熟悉本技术领域的技术人员应当理解,我们所描述的具体的实施例只是说明性的,而不是用于对本发明的范围的限定,熟悉本领域的技术人员在依照本发明的精神所作的等效的修饰以及变化,都应当涵盖在本发明的权利要求所保护的范围内。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值