具体实施方式
1概述
参考图1,数据聚合系统10包括数据聚合器12,数据聚合器12处理数据存储器16中输入表14内的信息,以产生关于存储在聚合表18中的信息。在一些情形下,数据聚合器12基于用户20在用户界面22上提出的查询来产生聚合表18。在其它情形下,数据聚合器12根据预计算方案来产生聚合表18。这种聚合在输入表14中提供数据总结,这对用户20是有用的。
参考图2A,表100的行1-7表示多维数据集的记录,从该多维数据集可产生聚合数据。表100是4维数据集,其包括表示关键字字段产品、经销商、年份和地点的四列以及表示非关键字字段销售额和价格的两列。用户查询可询问由年份、产品和地点分开并在经销商上聚合的销售额总和。这种聚合被称为3维聚合是因为,相对于原始的4个关键字字段,聚合了一个关键字字段而保留下3个关键字字段。与被该聚合作为基础的操作相对应,具有相同的保留关键字字段值的记录的组合被称为“聚合操作”。在该情形下,聚合操作是对非关键字字段中的值求和。图2B显示了表示对此实例产生的3维聚合数据集的表110。
如另一个实例,用户可查询由产品分开并在年份、经销商和地点上聚合的销售额或价格的总和(1维聚合)。在该情形下,聚合涉及组合具有相同的单独保留关键字字段产品值的列。图2C显示了表示所产生的1维聚合数据集结果的表120。对所有四个关键字字段上聚合的销售额和/或价格的总和产生由图2D中表130表示的0维聚合(或单一“总聚合”值)。
向用户提供聚合数据的一种方式是预计算可用在查询多维数据中的一些或甚至所有的可能聚合。该预计算可包括会花费相当多时间的大量计算。例如,从具有14维的多维数据集进行所有具有4维或更少维的聚合的预计算包括14C4+14C3+14C2+14C1+14C0=1471次聚合。如果该数据集有107列数据,则该预计算可包括多达1.471×1010列数据的处理。
用于减少多维聚合的预计算所需的计算量的一种策略包括产生多级聚合、基于高维聚合来计算低维聚合。例如,通过对6维聚合的2维进行聚合6C2=15次,可从单一的6维聚合计算出15次的4维聚合14C4。例如,如果6维聚合具有104列数据,则这些15次4维聚合的预计算涉及处理107列数据以产生6维聚合,并随后处理15×104=150,000列数据以产生这些15次的4维聚合,总的涉及10,150,000列数据的处理。作为比较,从14维数据分别预计算这些15次4维聚合中的每一个将涉及处理15×10,000,000=150,000,000列数据。
用于处理多维数据以产生聚合数据(例如,预计算和/或响应用户查询)的系统10根据所涉及操作是否“可级联(cascadable)”,对多级聚合使用不同的方式。如果对一组操作数执行操作的结果可分解成以下结果,则该操作是可级联的:(a)对操作数的第一子集执行操作的第一结果,以及(b)对操作数的第二子集执行操作的第二结果(其中第一子集和第二子集是互斥的和穷举的)。例如,加法由于加法的结合性而是可级联的:(a+b+...+z)=(a+b+...+m)+(n+o+...+z)。
可级联操作的实例包括执行求和和确定数据列中的最大值或最小值(即“极值”)。在上述实例中,表130(图2D)内销售额和价格字段中的值总和可在从表100内原始数据集的单级中计算出,或可选地,在利用例如表110(图2B)或表120(图2C)内中间聚合数据集的多级中计算出。这样使用多级是可以的,因为所涉及的求和操作是可级联的,从而允许系统10利用分解字段以被聚合进中间维集的第一多级聚合过程,将在以下2.2节中详细描述。
可用来聚合多维数据集中记录的不可级联操作的实例包括:确定记录的字段不同值的个数,确定字段中值的中间值,确定值集的多个极值的和(例如每一个地点的最贵产品的总和),以及确定值的多个和的极值(例如最大的年总销售额)。因此即使单一的结合性操作(例如加法或查找最大值)是可级联的,但包括两个结合性操作的复合操作可能是不可级联的,如上述实例中的“极值的和”与“和的极值”。
图2E和2F显示了基于不可级联操作聚合数据的实例。图2E显示表140,其表示基于对产品字段的不同值进行计数的操作,由经销商分开的在产品、年份和地点上聚合表100记录的结果。图2F显示表150,其表示基于对产品字段的不同值进行计数的操作,由年份分开的在产品、经销商和地点的上聚合表100记录的结果。
图2G显示表160,其表示产品字段不同值个数的总聚合值。在此实例中,有3个不同的产品A、B和C,如通过聚合表100记录而确定的。由于此“计数不同”操作是不可级联的,因此总值不是必然地从例如表140或表150中数据的中间聚合数据获得。在此实例中,由于表100原始数据的函数相关性,因此表140中的中间“不同的产品”值的和给出了正确的3个不同产品的结果。然而,表150中的中间“不同的产品”值的和给出了错误的6个不同产品的结果。
通过使用第二个多级聚合过程,系统10可基于不可级联操作利用函数相关性来处理用于多级聚合的数据列,将在下文2.4节中详细描述。在此实例中,每个产品具有唯一的经销商,因此在经销商和产品之间存在函数相关性(即,经销商的值函数上依赖于产品的值)。此函数相关性使得对基于不可级联操作的此次聚合,可通过正确选择中间数据而从该中间数据获得正确结果。
2利用数据流图聚合数据
在系统10中,将关于多维数据的计算通过有向图表示成数据流,计算要素(component)与图的顶点相关以及各要素之间的数据流对应于图的链环(弧、边)。实现此种基于图计算的系统在名称为”EXECUTINGCOMPUTATIONS EXPRESSED AS GRAPHS”的美国专利5,966,072中有描述。关于多维数据集的聚合计算实例将在下文利用“数据流图”来描述,以实现系统10中的聚合器12。
2.1单级聚合
参考图3,用于计算单级聚合的数据流图200包括输入数据集202(例如输入表14)和输出数据集210(例如聚合表18)。输入数据集202是一系列记录的来源,每个记录包括一组字段的值。一些字段是输入数据集202中多维数据的关键字字段。准备组件206处理记录,为汇总(rollup)组件208的处理作准备。准备组件206基于指定用来聚合数据的一组或多组关键字的“关键字集”输入文件204来处理所述记录。汇总组件208基于所选择的操作来组合多个输入记录的信息,并产生单一输出记录以替换多个输入记录。来自汇总组件208的聚合记录流被存储在输出数据集210中。
在执行单级聚合的实例中,图200处理2维输入数据集202中的记录,2维输入数据集202在下表中表示成具有两个关键字字段关键字0和关键字1以及一个非关键字字段属性的整数值的行。
关键字0 |
关键字1 |
属性 |
1 |
1 |
1 |
1 |
2 |
2 |
2 |
1 |
3 |
2 |
2 |
4 |
基于由一维(关键字字段)分开并对另一个关键字字段聚合的属性字段中的值求和,图200产生两个1维聚合数据集。“关键字集”输入文件204指定第一次聚合(通过单态集(singlet set){0}消除关键字1并保留关键字0)以及第二次聚合(通过单态集{1}消除关键字0并保留关键字1)。
为了在计算大量聚合(由大量关键字集指示的)时节省时间,准备组件206产生具有“合成关键字”值的记录流,其中合成关键字值可被用来执行所有待计算的聚合。例如,准备组件206基于输入文件204中关键字集与输入数据集202中记录的笛卡尔积产生具有合成关键字的记录(例如,利用对空值{}执行的“连接(join)”操作),该合成关键字由关键字0和关键字1的值组成。在下表中给出对此实例执行这种笛卡尔积的结果。
关键字0 |
关键字1 |
属性 |
关键字集 |
1 |
1 |
1 |
{0} |
1 |
2 |
2 |
{0} |
2 |
1 |
3 |
{0} |
2 |
2 |
4 |
{0} |
1 |
1 |
1 |
{1} |
1 |
2 |
2 |
{1} |
2 |
1 |
3 |
{1} |
准备组件206为不是对应关键字集部分的记录(行)的关键字字段中的值引入“通配符”值(例如“*”)。在下表中给出对此实例引入通配符值的结果。
关键字0 |
关键字1 |
属性 |
关键字集 |
1 |
* |
1 |
{0} |
1 |
* |
2 |
{0} |
2 |
* |
3 |
{0} |
2 |
* |
4 |
{0} |
* |
1 |
1 |
{1} |
* |
2 |
2 |
{1} |
* |
1 |
3 |
{1} |
* |
2 |
4 |
{1} |
由准备组件206产生的记录流随后由汇总组件208处理。汇总组件208对记录进行属性字段中的值求和,其中所述记录的合成关键字值相匹配(在此通配符值仅匹配其它通配符值)。下表表示所产生的输出数据集,该输出数据集包括由图200产生的两个1维聚合数据集。
关键字0 |
关键字1 |
求和(属性) |
1 |
* |
3 |
2 |
* |
7 |
* |
1 |
4 |
* |
2 |
6 |
前两行表示由关键字0分开并在关键字1上聚合的属性字段中值的和。
后两行表示由关键字1分开并在关键字0上聚合的属性字段中值的和。
可用各种表示方式中的任何一个来存储与数据流中记录相关联的合成关键字。例如,代替用于此实例中的关键字字段值阵列(其中一些是通配符),每个记录可与非通配符值的关键字值对的阵列相关联(当数据集的维数比关键字集的维数大时,这可能是更有效的表示法)。
2.2可级联操作的多级聚合
参考图4,用于计算多级聚合的数据流图300包括输入数据集302和输出数据集318。基于指定用来聚合数据的一组或多组关键字的第一集的输入文件304,输入数据集302是将由准备组件306和汇总组件308处理的一系列记录的来源。汇总组件308的输出是表示聚合数据集的记录流310,其中该聚合数据集的维数介于输入数据集302的维数和输出数据集318的维数之间。该中间数据可存储在数据集中以用于后续查询或数据处理,或可选地,可保留记录流而非必然地存储在文件中。基于指定用来聚合数据的一组或多组关键字的第二集的输入文件314,由准备组件312和汇总组件316处理记录310。将来自汇总组件316的聚合记录流存储在输出数据集318中。
在执行可级联操作的多级聚合的实例中,图300处理4维输入数据集302中的记录并产生包括所有六个2维求和聚合的数据集,4维输入数据集302在下表中表示成具有四个关键字字段关键字0、关键字1、关键字2和关键字3以及一个非关键字字段属性的整数值的行。
关键字0 |
关键字1 |
关键字2 |
关键字3 |
属性 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
2 |
2 |
1 |
1 |
2 |
2 |
3 |
输入文件304和314指定“汇总方案(rollup plan)”,该汇总方案包括输入文件304中的六个第一级关键字集以及输入文件314中的六个第二级关键字集。特别地,在此实例中,基于由二维(关键字字段)分开并在另外两个上聚合的属性字段中值的和,图300产生六个2维聚合数据集。下面六个第一级关键字集中的每一个表示保留在三个3维中间聚合数据集中之一的三个关键字字段(在记录310内):
关键字集1-1:{0,1,2}
关键字集1-2:{0,1,2}
关键字集1-3:{0,1,2}
关键字集1-4:{0,1,3}
关键字集1-5:{0,1,3}
关键字集1-6:{0,2,3}
下面六个第二级关键字集中的每一个表示保留在六个2维输出聚合数据集中之一的两个关键字字段:
关键字集2-1:{0,1}
关键字集2-2:{0,2}
关键字集2-3:{1,2}
关键字集2-4:{0,3}
关键字集2-5:{1,3}
关键字集2-6:{2,3}
第二级关键字集中的每个关键字字段选自对应第一级关键字集中的关键字字段(其中关键字集2-n对应关键字集1-n)。选择第一级关键字集中的关键字字段,使得两个字段的六种可能组合中的每一种可表示在第二级关键字集中。为了在生成合成关键字集值中的应用,输入文件314在记录中存储每个第二级关键字集(例如关键字集2-1)以及与其相关的第一级关键字集(例如关键字集1-1),以下将详细描述。
根据在第一级和第二级中聚合的维数,在一些情况下,选择使用哪个第一级关键字集将影响需要产生多少中间聚合数据集,以计算给定数目的输出聚合数据集(这将影响总计算的效率)。在此实例中,不管四个可能中间聚合数据集中的哪三个被选择,都需要三个中间聚合数据集来计算六个输出聚合数据集。将在下面2.3节中描述用于选择第一级关键字集的程序,在某种程度上该程序减少一些情况下所需的中间聚合数据集的数量。准备组件306基于输入文件304中不同关键字集(在此例中为3个不同关键字集)与输入数据集302中记录的笛卡尔积来产生具有一级合成关键字的记录。准备组件306还为不是对应关键字集部分的记录(行)的关键字字段中的值引入通配符值。在下表中给出了对此实例执行笛卡尔积并引入通配符值的结果。
关键字0 |
关键字1 |
关键字2 |
关键字3 |
属性 |
关键字集1 |
1 |
1 |
1 |
* |
1 |
{0,1,2} |
1 |
1 |
1 |
* |
2 |
{0,1,2} |
1 |
1 |
2 |
* |
3 |
{0,1,2} |
1 |
1 |
* |
1 |
1 |
{0,1,3} |
1 |
1 |
* |
2 |
2 |
{0,1,3} |
1 |
1 |
* |
2 |
3 |
{0,1,3} |
1 |
* |
1 |
1 |
1 |
{0,1,2} |
1 |
* |
1 |
2 |
2 |
{0,2,3} |
1 |
* |
2 |
2 |
3 |
{0,2,3} |
由准备组件306产生的记录流随后由汇总组件308处理。汇总组件308对合成关键字值(包括通配符值)相匹配的记录进行属性字段中的值求和。下表表示所产生的中间记录310。
关键字0 |
关键字1 |
关键字2 |
关键字3 |
属性 |
关键字集1 |
1 |
1 |
1 |
* |
3 |
{0,1,2} |
1 |
1 |
2 |
* |
3 |
{0,1,2} |
1 |
1 |
* |
1 |
1 |
{0,1,3} |
1 |
1 |
* |
2 |
5 |
{0,1,3} |
1 |
* |
1 |
1 |
1 |
{0,1,2} |
1 |
* |
1 |
2 |
2 |
{0,2,3} |
1 |
* |
2 |
2 |
3 |
{0,2,3} |
前两行表示由关键字0、关键字1和关键字2分开并在关键字1上聚合的属性字段中的值的和。接下来的两行表示由关键字0、关键字1和关键字3分开并在关键字2上聚合的属性字段中的值的和。最后三行表示由关键字0、关键字2和关键字3分开并在关键字1上聚合的属性字段中的值的和。
通过对在上表中示出的中间记录310以及在下表中示出的输入文件314中的关键字集记录执行连接操作,准备组件312产生具有第二级合成关键字的记录。将关键字集1的值用作连接操作的关键字。
关键字集1 |
关键字集2 |
{0,1,2} |
{0,1,} |
{0,1,2} |
{0,2} |
{0,1,2} |
{1,2} |
{0,1,3} |
{0,3} |
{0,1,3} |
{1,3} |
{0,2,3} |
{2,3} |
在下表中示出了所产生的从准备组件312发送至汇总组件316的连接记录(包括对于不在第二级关键字集中的关键字字段的通配符值)。
关键字0 |
关键字1 |
关键字2 |
关键字3 |
属性 |
关键字集1 |
关键字集2 |
1 |
1 |
* |
* |
3 |
{0,1,2} |
{0,1} |
1 |
1 |
* |
* |
3 |
{0,1,2} |
{0,1} |
1 |
* |
1 |
* |
3 |
{0,1,2} |
{0,2} |
1 |
* |
2 |
* |
3 |
{0,1,2} |
{0,2} |
* |
1 |
1 |
* |
3 |
{0,1,2} |
{1,2} |
* |
1 |
2 |
* |
3 |
{0,1,2} |
{1,2} |
1 |
* |
* |
1 |
1 |
{0,1,3} |
{0,3} |
1 |
* |
* |
2 |
5 |
{0,1,3} |
{0,3} |
* |
1 |
* |
1 |
1 |
{0,1,3} |
{1,3} |
* |
1 |
* |
2 |
5 |
{0,1,3} |
{1,3} |
* |
* |
1 |
1 |
1 |
{0,2,3} |
{2,3} |
* |
* |
1 |
2 |
2 |
{0,2,3} |
{2,3} |
* |
* |
2 |
2 |
3 |
{0,2,3} |
{2,3} |
汇总组件208对其合成关键字值(包括通配符值)相匹配的记录进行属性字段中的值求和。在下表中示出了包括通过图300产生的六个2维聚合数据集的所产生的输出数据集。
关键字0 |
关键字1 |
关键字2 |
关键字3 |
属性 |
1 |
1 |
* |
* |
6 |
1 |
* |
1 |
* |
3 |
1 |
* |
2 |
* |
3 |
* |
1 |
1 |
* |
3 |
* |
1 |
2 |
* |
3 |
1 |
* |
* |
1 |
1 |
1 |
* |
* |
2 |
5 |
* |
1 |
* |
1 |
1 |
* |
1 |
* |
2 |
5 |
* |
* |
1 |
1 |
1 |
* |
* |
1 |
2 |
2 |
* |
* |
2 |
2 |
3 |
上表中的行表示由包含整数值的关键字字段分开并在包含通配符值的关键字字段上聚合的属性字段中的值的和。
2.3关键字集的选择
以下是由数据流图的准备组件用来选择表示中间聚合数据集的字段的第一级关键字集的示例性程序。根据选择影响所需的中间聚合数的实例来描述该程序。该实例经由3维的中间聚合从5维数据(具有关键字字段0、1、2、3、4)产生2维数据,其产生10个可能的2维输出聚合数据集(因为5C2=10)。
通过选择表示第一中间聚合数据集中字段的任何一个第一3维关键字集{4,3,2},该组件启动。该组件确定可从第一中间聚合数据集产生哪些输出聚合数据集:{4,3}、{4,2}、{3,2}。然后该组件搜索第二关键字集{4,1,0},从该第二关键字集中可产生剩下的输出聚合数据集的最大数,其可产生{4,1}、{4,0}、{1,0}。重复此步骤直到产生所有2维输出聚合数据集,这为总的四个第一级关键字集产生另外的关键字集{3,2,1}和{3,2,0}。
第一级关键字集的其它选择产生较高数,从该较高数可产生所有2维输出聚合数据集。例如,以下列顺序{4,3,2}、{4,3,1}、{4,3,0}、{4,2,1}、{4,2,0}、{3,2,0}选择第一级关键字集产生六个第一级关键字集。因此在存在数百或数千可能的中间关键字集的一些情况下,根据上述程序选择关键字集可减少需要产生的中间聚合数据集的数量。
2.4不可级联操作的聚合
在一些情形中,基于不可级联操作来计算多维数据的聚合涉及直接从原始数据集计算大部分的期望聚合,这是因为计算这些聚合所需的一些信息在中间维数的聚合中丢失了。然而,在其它情形中,中间维数的聚合包含计算这些聚合中某些的信息。这种情形之一是数据集中一个关键字字段的值依赖于另一个关键字字段的值。
2.4.1没有函数相关的单级聚合
在描述一种通过利用函数相关性将计算分解成多级来减少聚合计算大小的情形之前,描述基于对目标字段执行不可级联的“计数不同”操作来计算聚合的单级方式是有用的。
参考图5,用于计算单级聚合的数据流图400包括输入数据集402和输出数据集412。图400包括准备组件406,其基于输入文件404处理记录以产生包括对应于期望聚合的合成关键字的记录流。图400被设置成利用汇总组件408和汇总组件410执行“计数不同”的操作。汇总组件408基于目标字段值来组合记录,使得每个不同值对每个合成关键字值出现一次。此第一汇总操作使得汇总组件410可通过计数具有匹配合成关键字的记录来确定目标字段中不同值的个数。来自汇总组件410的聚合记录流被存储在输出数据集412中。
即使数据流图400包括多个汇总组件,其执行的聚合计算是单级聚合,这是因为其输出并不是基于中间维数的数据产生的。
在基于不可级联的“计数不同”操作来执行单级聚合的实例中,图400处理2维输入数据集402中的记录,2维输入数据集402在下表中表示成对两个关键字字段关键字0和关键字1以及一个非关键字字段目标具有整数值的行,其中非关键字字段目标是“计数不同”操作的目标。
关键字0 |
关键字1 |
目标 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
1 |
0 |
1 |
0 |
0 |
0 |
0 |
1 |
2 |
0 |
1 |
基于在目标字段上执行的“计数不同”操作,图400产生两个1维聚合数据集和总聚合。输入文件404为1维聚合指定对应的关键字集为{0}和{1},为总聚合指定为{}。
准备组件406基于输入文件404中这些关键字集与输入数据集402中记录的笛卡尔积产生具有合成关键字值的记录流,输入数据集402中的记录具有对于不在该关键字集中的关键字字段的通配符值,如下表所示。
关键字0 |
关键字1 |
目标 |
关键字集 |
0 |
* |
0 |
{0} |
0 |
* |
0 |
{0} |
0 |
* |
0 |
{0} |
1 |
* |
0 |
{0} |
* |
0 |
0 |
{1} |
* |
1 |
0 |
{1} |
* |
1 |
0 |
{1} |
* |
0 |
0 |
{1} |
* |
* |
0 |
{} |
* |
* |
0 |
{} |
* |
* |
0 |
{} |
* |
* |
0 |
{} |
0 |
* |
1 |
{0} |
2 |
* |
1 |
{0} |
* |
0 |
1 |
{1} |
* |
0 |
1 |
{1} |
* |
* |
1 |
{} |
* |
* |
1 |
{} |
汇总组件408基于合成关键字的匹配值以及移除复制记录的目标字段来组合记录。在下表中表示所产生的记录。
关键字0 |
关键字1 |
目标 |
关键字集 |
0 |
* |
0 |
{0} |
1 |
* |
0 |
{0} |
* |
0 |
0 |
{1} |
* |
1 |
0 |
{1} |
* |
* |
0 |
{} |
0 |
* |
1 |
{0} |
2 |
* |
1 |
{0} |
* |
0 |
1 |
{1} |
* |
* |
1 |
{} |
汇总组件410组合具有匹配合成关键字值(关键字0和关键字1)的记录,并对所组合记录的数目进行计数,以产生不同目标字段值的个数。通过图400产生的输出数据集包括两个1维聚合数据集和总聚合,如下表所示。
关键字0 |
关键字1 |
计数不同(目标) |
0 |
* |
2 |
1 |
* |
1 |
2 |
* |
1 |
* |
0 |
2 |
* |
1 |
1 |
* |
* |
2 |
前三行表示由关键字0分开并在关键字1上聚合的目标字段中的不同值的个数。接下来的两行表示由关键字1分开并在关键字0上聚合的目标字段中不同值的个数。最后一行表示同时在二个关键字字段上聚合的目标字段中不同值的总数。
2.4.2基于函数相关的级
在不可级联操作的多级方法中,为了确保中间维数聚合包含基于这些中间维数聚合产生期望聚合所需的信息,至少一个关键字字段应至少部分地与另一关键字字段函数相关。字段值之间(例如,关键字字段和目标字段之间)的函数相关性可以各种数据类型出现。例如,如果一个字段值表示个体(例如,客户ID),则表示诸如性别、民族、或出生日期的属性的另一个字段值将与该字段值函数相关。当函数相关性中存在例外时,则一个字段“部分”或“近似”地与另一个字段函数相关,将在以下3.1节中详细描述。
图6显示包括第一级的数据流图500,该第一级产生相对于输入数据集502的降维聚合记录512。该第一级包括准备组件506以及两个汇总组件508和510,汇总组件508和510起到同上述图400中的作用。输入文件504包括关键字集,其中该关键字集包括与聚合操作的目标字段不相关的“非相关”关键字字段。图500还包括第二级,该第二级基于包括与目标字段相关的“相关”关键字字段的输入文件516中的关键字集进一步聚合记录512。也就是说,与目标字段相关的任何字段在最后一级被聚合。
在基于不可级联的“计数不同”操作来执行多级聚合的实例中,图500处理2维输入数据集502中的记录,2维输入数据集502在下表中表示成对两个关键字字段关键字0和关键字1以及为一个非关键字字段目标具有整数值的行,其中非关键字字段目标是“计数不同”操作的目标。关键字字段关键字0与目标字段函数相关。
关键字0 |
关键字1 |
目标 |
0 |
1 |
0 |
0 |
1 |
0 |
0 |
3 |
0 |
1 |
2 |
1 |
1 |
3 |
1 |
0 |
1 |
2 |
0 |
2 |
2 |
图500基于对目标字段执行的“计数不同”操作产生两个1维聚合数据集和总聚合。输入文件504和516指定“汇总方案”,该“汇总方案”包括输入文件504中的三个第一级关键字集和输入文件516中的三个第二级关键字集。第一级包括基于非相关关键字字段关键字1的值进行的汇总,关键字字段关键字1的值包括在第一级关键字集中:
关键字集1-1:{}
关键字集1-2:{}
关键字集1-3:{1}
在不可级联操作的多级方法中,第二级关键字集中的关键字字段不是必须仅从对应的第一级关键字集中的关键字字段选出。然而,第一级关键字集和第二级关键字集中的关键字字段被选择,以使得在第一级中聚合非相关维并在第二级中聚合相关维,正如在该实例中。在该实例中,第二级包括基于相关关键字字段关键字0的值进行的汇总,关键字字段关键字0的值包括在第二级关键字集中:
关键字集2-1:{0}
关键字集2-2:{}
关键字集2-3:{1}
准备组件506基于输入文件504中第一级关键字集与输入数据集502中记录的笛卡尔积产生具有合成关键字值的记录流,输入数据集502中的记录具有对于不在第一级关键字集中的任何非相关关键字字段的通配符值,如下表所示。
关键字0 |
关键字1 |
目标 |
关键字集1 |
0 |
* |
0 |
{} |
0 |
* |
0 |
{} |
0 |
* |
0 |
{} |
0 |
1 |
0 |
{1} |
0 |
1 |
0 |
{1} |
0 |
3 |
0 |
{1} |
1 |
* |
1 |
{} |
1 |
* |
1 |
{} |
1 |
2 |
1 |
{1} |
1 |
3 |
1 |
{1} |
0 |
* |
2 |
{} |
0 |
* |
2 |
{} |
0 |
1 |
2 |
{1} |
0 |
2 |
2 |
{1} |
汇总组件508基于合成关键字的匹配值以及移除复制记录的目标字段来组合记录。可选地,可从第一级合成关键字省去相关关键字字段关键字0(即在匹配中不考虑),这是因为关键字0的值与目标字段的值相关。所产生的记录如下表所示。
关键字0 |
关键字1 |
目标 |
关键字集1 |
0 |
* |
0 |
{} |
0 |
1 |
0 |
{1} |
0 |
3 |
0 |
{1} |
1 |
* |
1 |
{} |
1 |
2 |
1 |
{1} |
1 |
3 |
1 |
{1} |
0 |
* |
2 |
{} |
0 |
1 |
2 |
{1} |
0 |
2 |
2 |
{1} |
汇总组件510组合具有匹配合成关键字值(关键字0和关键字1)的记录,并对所组合记录的数目进行计数,以产生不同目标字段值的个数。在所产生的组合记录中不是必然地包括目标字段的值。所产生的中间记录512在下表中表示为包括1维聚合记录和2维聚合记录。
关键字0 |
关键字1 |
关键字集1 |
计数不同(目标) |
0 |
* |
{} |
2 |
1 |
* |
{} |
1 |
0 |
1 |
{1} |
2 |
0 |
2 |
{1} |
1 |
0 |
3 |
{1} |
1 |
1 |
2 |
{1} |
1 |
1 |
3 |
{1} |
1 |
通过对上表中示出的中间记录512以及下表中示出的输入文件516中的关键字集记录执行连接操作,准备组件514产生具有第二级合成关键字的记录。关键字集1的值被用作连接操作的关键字。
下表示出了所产生的从准备组件514发送到汇总组件518的连接记录(包括对于不在第二级关键字集中的关键字字段的通配符值)如下表所示。
关键字0 |
关键字1 |
关键字集1 |
关键字集2 |
计数不同(目标) |
* |
* |
{} |
{} |
2 |
* |
* |
{} |
{} |
1 |
0 |
* |
{} |
{0} |
2 |
1 |
* |
{} |
{0} |
1 |
* |
1 |
{1} |
{1} |
2 |
* |
2 |
{1} |
{1} |
1 |
* |
3 |
{1} |
{1} |
1 |
* |
2 |
{1} |
{1} |
1 |
* |
3 |
{1} |
{1} |
1 |
汇总组件518组合具有匹配合成关键字值(关键字0和关键字1)的记录,并对“计数不同(目标)”字段中的对应值求和,以产生不同目标字段值的个数。在下表中示出的所产生的输出记录被存储在输出数据集520中。
关键字0 |
关键字1 |
计数不同(目标) |
* |
* |
3 |
0 |
* |
2 |
1 |
* |
1 |
* |
1 |
2 |
* |
2 |
2 |
* |
3 |
2 |
上表中的行表示由包含整数值的关键字字段分开并在包含通配符值的关键字字段上聚合的目标字段的不同值的个数。
2.4.3增加补充级
上述通过多级聚合提供的节省计算时间可扩展到补充级聚合。应该在聚合的每一级适当处理相关和非相关关键字字段,正如在以下实例中一样。例如,为了减少数据集的维数,可将通配符值添加到要被移除的关键字字段。对于非相关关键字字段,一旦通过在合成关键字和目标字段上的初始汇总设定了非相关关键字字段中的通配符值和特定值的模式,则该模式不会改变。如果非相关关键字字段在初始汇总期间获得通配符值,则该关键字字段应仅用来为省略了该关键字字段的后续汇总操作匹配值。如果非相关关键字字段在初始汇总期间保留特定值,则该关键字字段应仅用来为包括该关键字字段的后续汇总操作匹配值。在上述实例中,如果对应的第一级和第二级关键字集仅是相关关键字字段不同,则在第二级处理期间将不把通配符值引入非相关关键字字段,从而产生正确的结果。
图7示出了实现3级聚合计算的示例性数据流图600。准备组件606基于包括非相关关键字字段的输入文件604中的关键字集来处理输入数据集602的记录。汇总组件608基于目标字段和合成关键字来组合记录,以及汇总组件609基于所有关键字字段来组合记录,从而使得中间记录610具有与输入数据集602相同的维数。输入文件614中的第二级关键字集包括非相关关键字字段以及可选地包括一些相关关键字字段,其中这些相关关键字字段适于得出具有某个指定维数的中间数据集618。输入文件622中的第三级关键字集包括用于产生具有被期望的较低维数的输出数据集626的最后关键字字段。
例如,输入数据集602具有4维,其中2维相关(关键字0和关键字1)而另外2维不相关(关键字2和关键字3)。输出数据集626包括基于3维中间数据集618的具有2维或更少维的聚合。对于该实例的适当3级汇总图如下表所示。
关键字集1 |
关键字集2 |
关键字集3 |
{} |
{0,1,2} |
{0,1} |
{2} |
{0,1,2} |
{0,2} |
{2} |
{0,1,2} |
{1,2} |
{} |
{0,1,2} |
{0} |
{} |
{0,1,2} |
{1} |
{2} |
{0,1,2} |
{2} |
{3} |
{0,1,3} |
{0,3} |
{3} |
{0,1,3} |
{1,3} |
{3} |
{0,1,3} |
{3} |
{2,3} |
{0,2,3} |
{2,3} |
如上所述,存在或不存在非相关关键字字段在1级和3级之间没有变化。
在一些情形下,通过估计适当维数的所有可能的关键字集,根据可从它们产生的预期聚合的数目对它们分级,并选择具有最大级的关键字集,则可确定关键字集的选择,正如在2.3节中描述的程序。
3可选方式
3.1近似函数相关
利用函数相关减少聚合计算量的方法可应用到其中函数相关性由于存在例外而不严格的情形中。例如,在零售链中,可能在“客户ID”和“商店”之间存在微弱的函数相关性,这使得80%的客户只能在一家商店购物。还可能有在数据集中仅具有单一交易的“单个”客户,并因此关于该客户的所有字段均与该客户ID函数相关。通过确定单个客户的数量以及各种函数相关性的强度,输入数据集可分成能被适当处理的一些类。
3.2高阶函数相关
在一些情形中,可利用高阶函数相关性来减少计算量。一些关键字字段可与目标字段和另一个字段的组合函数相关。
例如,如果存在4个非相关维并且期望所有2维聚合,则可能存在对应10次汇总操作的10次聚合。然而,如果维数1-3与维数0和目标字段的组合相关,则涉及维数0的四次汇总操作可压缩成单一汇总操作,并且汇总操作集可以从10减少到7。
3.3实现
上述数据聚合方法可利用在计算机上执行的软件来实现。例如,该软件形成一个或多个计算机程序中的程序,所述一个或多个计算机程序在一个或多个已编程或可编程的计算机系统(其可以是诸如分布式、客户/服务器、或网格的各种结构)上执行,所述已编程或可编程的计算机系统均包括至少一个处理器、至少一个数据存储系统(包括易失性和非易失性存储器和/或存储元件)、至少一个输入设备或端口、以及至少一个输出设备或端口。该软件可形成较大程序的一个或多个模块,例如该软件提供与计算图形的设计和配置相关的其它服务。可将图形的节点和元素实现为存储在计算机可读取介质中的数据结构或者符合存储在数据库中的数据模型的其它有组织的数据。
该软件可提供在诸如CD-ROM的介质上或通过网络传送(被编码在所传送的信号中)到执行该软件的计算机,该介质可由通用或专用可编程的计算机进行读取。所有功能可在专用计算机上执行,或者利用诸如协处理器的专用硬件来执行。该软件可实现为分布式形式,其中该软件指定的不同的计算部分由不同的计算机执行。每个这样的计算机程序优选地存储在或下载到由通用或专用可编程的计算机可读取的存储介质或设备上(例如固体存储器或介质,或者磁介质或光学介质),用于在该计算机系统读取该存储介质或设备时进行配置并操作该计算机,以执行本文描述的程序。本发明的系统还可实现为计算机可读取的存储介质,配置有计算机程序,其中如此配置该存储介质使得计算机系统以特定和预定方式操作以执行本文描述的功能。
需要理解的是,前述描述意在说明而并非限制本发明的范围,本发明的范围由附加的权利要求书所限定。例如,上述的多个功能步骤可以不同的顺序来执行,实质上并不影响总体处理。其它实施例仍在所附权利要求书的范围内。