一种用归并算法计算一对一join、一对多join的方法与流程

文档序号:13704025阅读:493来源:国知局

本发明涉及计算一对一join、一对多join,更具体地来说,特别涉及一种用归并算法计算一对一join、一对多join的方法。



背景技术:

有时为了得到完整的结果,我们需要从两个或更多的数据集中获取结果。我们就需要执行join计算。

一对一join的关系是两个数据集之间的一种关系,该关系中第一个数据集中的单个行与第二个数据集中的单个行相关。如果这两个数据集关联的键都为主键时,称这两个数据集为同维数据集。

一对多join的关系是两个数据集之间的一种关系,该关系中第一个数据集中的单个行与第二个数据集中的一个或多个行相关,但第二个数据集中的一个行只可以与第一个数据集中的一个行相关。如果在应用中,某个数据集包含了一片或者多片区域,每一片区域都针对同一个对象,但是各区域又各自展示不同的主题,像这样的一对多join关系我们称之为主子数据集。其中每一小片区域称为子数据集,子数据集构成的数据集整体称为主数据集。主子数据集的特点是子数据集的关联键是主数据集关联主键的一部分。

数据集可通过键将彼此联系起来。主键(primarykey)是一个列,在这个列中的每一行的键值都是唯一的。在数据集中,每个主键的键值都是唯一的。这样做的目的是在不重复每个数据集中的所有数据的情况下,把数据集间的数据交叉捆绑在一起。

hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的键值(又叫做预映射,pre-image),通过散列算法,变换成固定长度的hash值。这种转换是一种压缩映射,也就是,hash值的空间通常远小于键值的空间,不同的键值可能会散列成相同的hash值,所以不可能从hash值来唯一的确定键值。简单的说就是一种将任意长度的键值压缩到某一固定长度的hash值的函数。

目前现有的大数据量一对一join、一对多join的外存计算技术有以下两种:一种采用了hash方法,把外存中的数据集a和b进行关联的键值转换成hash值,外存计算的实质运算只能内存做,因为针对的是大数据量的计算,数据集a和b的数据量比较大,内存放不下数据集a和b,所以把数据集a和b分成若干个内存能放下的小段,因为计算的是join,所以hash方法必须保证让数据集a和b中关联的记录分到同一段中,相同键值的hash值是相同的,因为相同的hash值被分到同一段了,所以相同的键值也在同一段中。如果数据集a和b中的某个分段太大了内存装不下,就只能二次hash再分更小的段;但是hash函数也有一些缺点,这个缺点是hash数据集不可避免的,即冲突现象:对不同的关键字可能得到同一hash地址hash算法的另一个缺点是,用hash方法每次都读取一点点数据然后写出去,而且写的动作比读的动作慢好几倍,还会导致hash结果非常碎片化,很难用了。另一种是用归并算法计算,归并算法比hash算法效率高很多,减少了大量硬盘io的时间;但是归并算法的要求是两个数据集里面的数据都是有序的,缺点是实施条件高。

这两种对应关系(一对一join同维数据集、一对多join主子数据集)的特点是计算时永远只用到这两个关联键,不会用到别的键,关联键是事先知道并且确定的。传统的办法还是hash分段或者归并算法(只有确定的知道数据集有序时才会采用。无序的数据集实际上很少采用,因为归并算法计算前需要对无序的数据集进行排序,而排序的成本比hash分段的成本高很多),为什么不在保存数据集的时候保存数据集的次序呢,因为关系数据库是无序集合体系的,理论上不能保存数据集的次序,很难利用这一特点。这样计算的效率比较低或者实施条件高,如何利用关联键是事先知道并且确定的这个特点来提升一对一join同维数据集、一对多join主子数据集的计算效率或者降低实施条件是目前需要解决的问题。

针对上述方法的问题本发明提供了一种用归并算法计算一对一join、一对多join的方法。



技术实现要素:

为了克服前述问题,本发明的目的在于提供一种用归并算法计算一对一join、一对多join的方法。

一种用归并算法计算一对一join、一对多join的方法,实施条件为:

数据量非常大内存装不下的互相关联数据集a和b,特点是关联键是事先知道并且确定的(此发明的必要条件)。如果数据集a中的主键对应数据集b中的主键,则a和b是一对一join同维数据集;如果数据集a中的主键对应子数据集b中的关联键,(子数据集b中的关联键是主数据集a中的主键一部分)则a和b是一对多join主子数据集。

使用步骤为:

1.对在外存中的数据集a和b进行如下准备工作,同维数据集关系按照它们的主键排序,主子数据集关系主数据集a按照它的主键排序,子数据集b按关联主键的键排序或者全部和主键有关系的键排序(关联对应的键放到前边),把这些准备计算join的历史数据集全部保存好;(这是一次性准备工作,以后a和b再计算join时就不需要做这步准备了。)

2.用归并算法计算一对一join同维数据集a和b时,数据集a和b只要各自遍历一次,然后就可以在合并数据集中引用记录了。

计算一对多join主子数据集a和b的时候,原理和方法同上步骤2。就是把子数据集主键换成子数据集对应主数据集的关联键。

如上所述的一种用归并算法计算一对一join、一对多join的方法,其特征在于,实施条件为一对一join同维数据集、一对多join主子数据集,关联键是事先知道并且确定的。

如上所述的一种用归并算法计算一对一join、一对多join的方法,其特征在于,把准备用来计算一对一join、一对多join的历史数据集排序保存准备好。

如上所述的一种用归并算法计算一对一join、一对多join的方法,其特征在于,步骤1这是一次性准备工作,以后再计算这一对一join、一对多join数据集时就不需要做这步准备了。

如上所述的一种用归并算法计算一对一join、一对多join的方法,其特征在于,数据集一次排序保存后可多次用归并算法计算。

如上所述的一种用归并算法计算一对一join、一对多join的方法,其特征在于,用归并算法计算一对多join主子数据集的时候,方法和原理同计算一对一join同维数据集一样,只不过就是把子数据集主键换成子数据集对应主数据集的关联键。

如上所述的一种用归并算法计算一对一join、一对多join的方法,其特征在于,用归并算法计算一对一join或者一对多join时,优势是只需要很小的内存就可以完成大数据的计算。

如上所述的一种用归并算法计算一对一join、一对多join的方法,其特征在于,用归并算法计算一对一join或者一对多join时,同以前用hash方法解决同样的问题比,减少了大量硬盘io的时间。

如上所述的一种用归并算法计算一对一join、一对多join的方法,其特征在于,所述方法适用于所有的系统、平台、软件、语言中。

以上只是一个理论上的描述,实际实现过程中还会有各种优化的可能,但基本原理不会改变。本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的保护范围。

本发明的有益效果

在数据量大内存不能装下所需要计算的数据集时,事先对无序的数据集里的数据进行排序,然后就可以用归并算法计算一对一join、一对多join了,归并算法的优势是可以用很小的内存完成大数据集的计算。同以前用hash方法解决同样的问题比,减少了大量硬盘io的时间。

下面结合附图和实施例对本发明进一步说明。

附图说明

图1为本发明的流程图;

具体实施方式

一家信息系统技术有限公司,业务是专门生产销售报表软件。经常碰到以下情况,计算机对订单的情况进行统计,用到订单数据集(销售订单号,销售日期,客户,经办人,状态,备注,地区)和订单明细数据集(销售订单号,商品,数量,单价,成本价,完成数量,金额),订单数据集和订单明细数据集是一对多join主子数据集的关系,关联键是销售订单号并且确定的,这两个数据集里面的数据无序并且数据量非常大内存装不下,软件缺点是每次计算一对多join都得用hashjoin计算(结果碎片化,非常难用),程序员根据这种情况以及公司产品的特点进行如下设计以提高计算速度,完全符合本发明专利的实施场景。

在外存中对订单数据集a和订单明细数据集b按主键销售订单号由小到大排序,排序以后进行保存。

现在计算机计算北京地区订单明细项金额超过100元的金额合计,地区需要从订单数据集a中获取到,金额需要从订单明细数据集b中获取到,需要把数据集a和数据集b进行一对多join起来,这时候用归并算法计算数据集a和b的一对多join,数据集a和b只要各自遍历一次,在计算完以后合并的数据集c(销售订单号,地区,金额)中进行遍历过滤,遍历条件是地区是北京的和金额超过100元的,找出符合条件的记录,然后进行统计金额合计。

上面这个例子是计算一对多join主子数据集,一对一join同维数据集用的方法和原理同上。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1