G06F9/50 G06F16/22 G06F16/28
1.一种大数据聚集计算方法,其特征在于,包括:
从内存的mdp数据结构中读取任一行未进行聚集计算的原始数据,根据操作所述原始数据的SQL语句中的分组字段,对读取的所述原始数据进行分组;
若所述原始数据所属分组的key值在所述内存的hash结构中不存在,则为所述hash结构申请内存以存储所述key值,为所述内存中的tupleRowStream结构申请内存创建tupleRow结构以存储所述分组的聚集计算结果;
若为所述hash结构和所述内存中的tupleRowStream结构都成功申请到内存,则将所述key值存储到所述hash结构中,将所述原始数据经过所述SQL语句中的聚集函数计算获取的聚集计算结果存储到所述内存中的tupleRow结构中,直到所述mdp数据结构中的所有原始数据都进行聚集计算。
2.根据权利要求1所述的方法,其特征在于,所述mdp数据结构为二维表结构;
所述hash结构的key值为存储在所述hash结构中分组的key值,所述hash结构的key值对应的value值为tupleRow指针,所述tupleRow指针指向所述key值对应的聚集计算结果;
所述内存中的tupleRowStream结构包含多个tupleRow结构,各所述tupleRow结构的列数等于所述聚集函数的个数,各所述tupleRow结构用于存储一个所述分组的聚集计算结果。
3.根据权利要求1所述的方法,其特征在于,为所述hash结构申请内存,为所述内存中的tupleRowStream结构申请内存创建tupleRow结构的步骤具体包括:
根据所述key值的类型,确定为所述hash结构申请内存的大小;
根据所述聚集计算结果的类型,确定为所述内存中的tupleRowStream结构申请内存的大小。
4.根据权利要求1所述的方法,其特征在于,将所述原始数据经过所述SQL语句中的聚集函数计算获取的聚集计算结果存储到所述tupleRow结构中的步骤具体包括:
若所述tupleRow结构中的任一列存储聚集函数count的聚集计算结果,则将该列的值初始化为1;
若所述tupleRow结构中的任一列存储聚集函数sum的聚集计算结果,则将读取的所述原始数据中sum函数的参数字段对应的值作为该列的值;
若所述tupleRow结构中的任一列存储聚集函数max的聚集计算结果,则将读取的所述原始数据中max函数的参数字段对应的值作为该列的值。
5.根据权利要求1所述的方法,其特征在于,还包括:
若所述原始数据所属分组的key值在所述内存的hash结构中存在,则使用所述聚集函数对读取的所述原始数据和所述key值对应的聚集计算结果进行聚集计算,获取最新的聚集计算结果;
将所述最新的聚集计算结果作为所述key值对应的聚集计算结果。
6.根据权利要求5所述的方法,其特征在于,使用所述聚集函数对读取的所述原始数据和所述key值对应的聚集计算结果进行聚集计算,获取最新的聚集计算结果的步骤具体包括:
若所述tupleRow结构中的任一列存储聚集函数count的聚集计算结果,则将该列中的聚集计算结果加1,获取该列最新的聚集计算结果;
若所述tupleRow结构中的任一列存储聚集函数sum的聚集计算结果,则将该列中的聚集计算结果加上读取的所述原始数据中sum函数的参数字段对应的值,获取该列最新的聚集计算结果;
若所述tupleRow结构中的任一列存储聚集函数max的聚集计算结果,则获取该列中的聚集计算结果与读取的所述原始数据中max函数的参数字段对应的值两者中的最大值,将所述最大值作为该列最新的聚集计算结果。
7.根据权利要求1所述的方法,其特征在于,还包括:
若所述hash结构和所述内存中的tupleRowStream结构中至少一个未成功申请到内存,则将读取的所述原始数据存储到外存中的tupleRowStream结构中;其中,所述外存中的tupleRowStream结构与所述mdp数据结构的列数相同;
相应地,直到所述mdp数据结构中的所有原始数据都进行聚集计算的步骤之后还包括:
若所述内存的剩余大小大于预设大小,则将所述外存中预设大小的原始数据读取到所述内存中;
对新读取到所述内存中的原始数据执行读取、分组、申请内存和聚集计算的步骤,直到所述外存中不存在所述原始数据。
8.根据权利要求7所述的方法,其特征在于,若为所述hash结构和所述内存中的tupleRowStream结构都成功申请到内存,则将所述key值存储到所述hash结构中,将所述原始数据经过所述SQL语句中的聚集函数计算获取的聚集计算结果存储到所述内存中的tupleRow结构中的步骤还包括:
若为所述hash结构和所述内存中的tupleRowStream结构都成功申请到内存,且所述外存中不存有原始数据,则将所述key值存储到所述hash结构中,将所述原始数据经过所述SQL语句中的聚集函数计算获取的聚集计算结果存储到所述内存中的tupleRow结构中;
若为所述hash结构和所述内存中的tupleRowStream结构都成功申请到内存,且所述外存中已存有原始数据,则将读取的所述原始数据存储到所述外存中的tupleRowStream结构中。
9.一种大数据聚集计算装置,其特征在于,包括:
分组模块,用于从内存的mdp数据结构中读取任一行未进行聚集计算的原始数据,根据操作所述原始数据的SQL语句中的分组字段,对读取的所述原始数据进行分组;
申请模块,用于若所述原始数据所属分组的key值在所述内存的hash结构中不存在,则为所述hash结构申请内存以存储所述key值,为所述内存中的tupleRowStream结构申请内存创建tupleRow结构以存储所述分组的聚集计算结果;
存储模块,用于若为所述hash结构和所述内存中的tupleRowStream结构都成功申请到内存,则将所述key值存储到所述hash结构中,将所述原始数据经过所述SQL语句中的聚集函数计算获取的聚集计算结果存储到所述tupleRow结构中,直到所述mdp数据结构中的所有原始数据都进行聚集计算。
10.一种电子设备,其特征在于,包括:
至少一个处理器、至少一个存储器和总线;其中,
所述处理器和存储器通过所述总线完成相互间的通信;
所述存储器存储有可被所述处理器执行的程序指令,所述处理器调用所述程序指令能够执行如权利要求1至8任一所述的方法。
本发明实施例属于大数据分析技术领域,更具体地,涉及一种大数据聚集计算方法及装置。
在做大数据分析时,经常会涉及到对相同数据进行聚集计算,聚集计算是指根据一列或者多列作为key值,对相同key值对应的value值做sum、count、max和min等聚集函数的运算,输出单个结果行。
由于大数据分析中原始数据的数据量过于庞大,在分组的key值基数也很大的情况下,计算机剩余内存可能不足以存放下所有要计算的数据。现有技术可能会每次计算指定个数的key值,这种方法可能会造成申请不到内存从而导致系统崩溃的问题,也有可能造成没有充分利用内存计算,会严重影响运算效率。
为了克服这个问题,现有技术可能会在做聚集计算时,确定计算机此时剩余多少内存,利用该时刻剩余内存量来进行计算,这种做法虽然不会存在申请不到内存的问题,也充分利用了此刻的内存。但是在计算过程中,计算机很可能又释放出很多空闲的内存,而这些空闲内存没有得到利用。
综上所述,现有技术仅对某一时刻剩余的内存量进行了充分利用,在计算过程中释放出的空闲内存没有得到利用,从而导致内存利用率较低。
为克服上述现有的大数据聚集计算内存利用率低的问题或者至少部分地解决上述问题,本发明实施例提供一种大数据聚集计算方法及装置。
根据本发明实施例的第一方面,提供一种大数据聚集计算方法,包括:
从内存的mdp数据结构中读取任一行未进行聚集计算的原始数据,根据操作所述原始数据的SQL语句中的分组字段,对读取的所述原始数据进行分组;
若所述原始数据所属分组的key值在所述内存的hash结构中不存在,则为所述hash结构申请内存以存储所述key值,为所述内存中的tupleRowStream结构申请内存创建tupleRow结构以存储所述分组的聚集计算结果;
若为所述hash结构和所述内存中的tupleRowStream结构都成功申请到内存,则将所述key值存储到所述hash结构中,将所述原始数据经过所述SQL语句中的聚集函数计算获取的聚集计算结果存储到所述tupleRow结构中,直到所述mdp数据结构中的所有原始数据都进行聚集计算。
根据本发明实施例第二方面提供一种大数据聚集计算装置,包括:
分组模块,用于从内存的mdp数据结构中读取任一行未进行聚集计算的原始数据,根据操作所述原始数据的SQL语句中的分组字段,对读取的所述原始数据进行分组;
申请模块,用于若所述原始数据所属分组的key值在所述内存的hash结构中不存在,则为所述hash结构申请内存以存储所述key值,为所述内存中的tupleRowStream结构申请内存创建tupleRow结构以存储所述分组的聚集计算结果;
存储模块,用于若为所述hash结构和所述内存中的tupleRowStream结构都成功申请到内存,则将所述key值存储到所述hash结构中,将所述原始数据经过所述SQL语句中的聚集函数计算获取的聚集计算结果存储到所述tupleRow结构中,直到所述mdp数据结构中的所有原始数据都进行聚集计算。
根据本发明实施例的第三个方面,还提供一种电子设备,包括:
至少一个处理器;以及
与所述处理器通信连接的至少一个存储器,其中:
所述存储器存储有可被所述处理器执行的程序指令,所述处理器调用所述程序指令能够执行第一方面的各种可能的实现方式中任一种可能的实现方式所提供的大数据聚集计算方法。
本发明实施例提供一种大数据聚集计算方法及装置,该方法通过每读取一行为进行聚集计算的原始数据,就对该行数据进行分组,结合hash技术判断该行数据所属的分组是否为一个新分组,若为一个新分组则根据内存使用情况判断剩余内存是否可以存放下一个新分组的key值和聚集计算结果,若能存放下则进行聚集计算,并对聚集计算结果和key值进行保存,从而每读取到一行原始数据就实时根据内存情况进行聚集计算,最大限度地使用内存,提高了运算效率。
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本发明实施例提供的大数据聚集计算方法整体流程示意图;
图2为本发明实施例提供的大数据聚集计算装置整体结构示意图;
图3为本发明实施例提供的电子设备整体结构示意图。
为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
在本发明的一个实施例中提供一种大数据聚集计算方法,图1为本发明实施例提供的大数据聚集计算方法整体流程示意图,该方法包括:S101,从内存的mdp数据结构中读取任一行未进行聚集计算的原始数据,根据操作所述原始数据的SQL语句中的分组字段,对读取的所述原始数据进行分组;
其中,mdp(Memory Data Pack,内存数据包)数据结构是内存中传输数据的结构,可以从中取出一行数据,也可以取出一行中指定列的数据。mdp数据结构中存储的是原始数据,即没有经过分组和聚集计算的数据。mdp数据结构为一张二维表,例如,学生表的mdp数据结构中存储有学生的学号、姓名、班级和年龄。每一列对应学生的一个属性,例如第一列为学生的学号,第二列为学生的姓名,第三列为学生所在班级,第四列为学生的年龄。每一行为某一学生的学号、姓名、班级和年龄。从mdp数据结构中每次读取一行未进行聚集计算的原始数据,可以任意读取,也可以按照某种排序读取。例如读取的一行数据为学号为20160011,姓名张三,班级一年级,年龄6岁。获取操作该mdp数据结构的SQL(StructuredQuery Language,结构化查询语言)语句,例如,select count(学号),sum(年龄),max(年龄)from student group by班级,group by后面的字段班级为分组字段,student为表名。通过SQL语句中的分组字段对读取的一行原始数据进行分组,如通过班级对读取的一行数据进行分组,获知学号为20160011的学生张三属于分组类别一年级。
S102,若所述原始数据所属分组的key值在所述内存的hash结构中不存在,则为所述hash结构申请内存以存储所述key值,为所述内存中的tupleRowStream结构申请内存创建tupleRow结构以存储所述分组的聚集计算结果;
其中,hash结构一般翻译为散列,也有直接音译为哈希,是指将任意长度的输入通过散列算法变换成指定长度的输出,该输出就是散列值。分组的key值为分组的唯一标识。本实施例中在内存中创建有hash结构,以存储在hash结构中分组的key值作为hash结构的key值。hash结构的任一key值对应的value值为一个tupleRow的指针,该指针指向该key值对应的聚集计算结果。同时,在内存中创建有tupleRowStream结构。内存中的tupleRowStream结构用于在内存中存储聚集计算结果,存储结构是一行数据,该结构中的每行数据对应同一个分组的key值,为需要输出聚集计算结果,在内存中tupleRowStream结构中的每行数据用tupleRow结构表示。内存中的tupleRowStream结构包含多个tupleRow结构。在内存中tupleRowStream结构的列数,根据SQL语句中聚集函数的个数确定,比如SQL语句中的聚集函数为count、sum和max,则每行要输出三列,则内存中的tupleRowStream结构每行中就有三列,第一列存储count的聚集计算结果,第二列存在sum的聚集计算结果,第三列存储max的聚集计算结果,本实施例不限于这三种聚集函数,也不限于这种存储顺序。agg函数一般称为聚集函数,是对一组值执行计算并返回单一值的函数。通常与group by子句一起使用。常见agg函数如sum、count、max、min等。
在mdp数据结构中读取到一行原始数据后并对其进行分组后,在hash结构中查该行原始数据所属分组的key值在hash结构中是否已经存在。例如分组类别一年级的key值为1,判断1是否在hash结构中存在。如果存在,说明这个分组在hash结构中已经存在。如果不存在,说明这是一个新的分组,需要在hash结构中存储新分组的key值和该新分组的聚集计算结果。
此时的内存是否可以存储下这个新的key值和该key值对应的聚集计算结果,需要满足两个条件,即a、为hash结构向系统能申请到存储一个新key值的内存;b、为内存中的tupleRowStream结构也可以申请到内存来创建一个新的tupleRow结构以存储新key值对应的聚集计算结果。根据key值的类型,确定为hash结构申请内存的大小。根据聚集计算结果的类型,确定为内存中的tupleRowStream结构申请内存的大小。
S103,若为所述hash结构和所述内存中的tupleRowStream结构都成功申请到内存,则将所述key值存储到所述hash结构中,将所述原始数据经过所述SQL语句中的聚集函数计算获取的聚集计算结果存储到所述tupleRow结构中,直到所述mdp数据结构中的所有原始数据都进行聚集计算。
当这两个条件同时满足时,这个新的key值可以放入hash结构,使用聚集函数对读取的一行原始数据进行聚集计算,得到一行聚集计算结果,该行聚集计算结果的列数等于SQL语句中聚集函数的个数。将该行聚集计算结果存储到新建的tupleRow结构中。然后迭代执行S101-S103的步骤,直到mdp数据结构中的所有元素数据都进行聚集计算。
本实施例通过每读取一行为进行聚集计算的原始数据,就对该行数据进行分组,结合hash技术判断该行数据所属的分组是否为一个新分组,若为一个新分组则根据内存使用情况判断剩余内存是否可以存放下一个新分组的key值和聚集计算结果,若能存放下则进行聚集计算,并对聚集计算结果和key值进行保存,从而每读取到一行原始数据就实时根据内存情况进行聚集计算,最大限度地使用内存,提高了运算效率。
在上述实施例的基础上,本实施例中将所述原始数据经过所述SQL语句中的聚集函数计算获取的聚集计算结果存储到所述tupleRow结构中的步骤具体包括:若所述tupleRow结构中的任一列存储聚集函数count的聚集计算结果,则将该列的值初始化为1;若所述tupleRow结构中的任一列存储聚集函数sum的聚集计算结果,则将读取的所述原始数据中sum函数的参数字段对应的值作为该列的值;若所述tupleRow结构中的任一列存储聚集函数max的聚集计算结果,则将读取的所述原始数据中max函数的参数字段对应的值作为该列的值。
例如,读取的一行原始数据为学号为20160011,姓名张三,班级一年级,年龄6岁,该行原始数据所属的分组一年级的key值1在hash结构中不存在,说明该行原始数据所属的分组为一个新分组,在hash结构中存储分组一年级的key值1。由于是一个新分组,为新分组创建的tupleRow结构为空,然后对读取的该行数据使用SQL语句中的聚集函数count(学号),sum(年龄),max(年龄),计算分组一年级的聚集计算结果,count的聚集计算结果为1,存储在tupleRow结构的第一列,sum的聚集计算结果为6,存储在tupleRow结构的第二列,max的聚集计算结果为6,存储在tupleRow结构的第三列。
在上述实施例的基础上,本实施例还包括:若所述原始数据所属分组的key值在所述内存的hash结构中存在,则使用所述聚集函数对读取的所述原始数据和所述key值对应的聚集计算结果进行聚集计算,获取最新的聚集计算结果;将所述最新的聚集计算结果作为所述key值对应的聚集计算结果。
具体地,若读取的原始数据所属分组的key值在内存的hash结构中存在,不需要额外的内存空间来存储数据,该key值在hash结构中已经存在,并且在tupleRow中也存储了该key值对应的经过聚集函数计算后的值。只需要使用不同的聚集函数,对该key值对应的tupleRow中相应列的聚集计算结果和读取的原始数据进行聚集计算,使用本次的最新聚集计算结果更新tupleRow中相应列的值。其中,通过hash结构到该key值,对应的value值就是该key值对应的tupleRow。
在上述实施例的基础上,本实施例中使用所述聚集函数对读取的所述原始数据和所述key值对应的聚集计算结果进行聚集计算,获取最新的聚集计算结果的步骤具体包括:若所述tupleRow结构中的任一列存储聚集函数count的聚集计算结果,则将该列中的聚集计算结果加1,获取该列最新的聚集计算结果;若所述tupleRow结构中的任一列存储聚集函数sum的聚集计算结果,则将该列中的聚集计算结果加上读取的所述原始数据中sum函数的参数字段对应的值,获取该列最新的聚集计算结果;若所述tupleRow结构中的任一列存储聚集函数max的聚集计算结果,则获取该列中的聚集计算结果与读取的所述原始数据中max函数的参数字段对应的值两者中的最大值,将所述最大值作为该列最新的聚集计算结果。
例如,读取的一行原始数据为学号为20160011,姓名张三,班级一年级,年龄6岁,该行原始数据所属的分组一年级的key值1在hash结构中存在,是一个已有分组。然后在hash结构中到key值1,获取该key值对应的value值,即以tupleRow结构存储的分组一年级的聚集计算结果。将tupleRow结构中第一列count函数已存的聚集计算结果加1,即将学号为20160011进行计数,学号增加了1个;将tupleRow结构第二列中sum函数已存的聚集计算结果加上张三的年龄;将存储在tupleRow结构的第三列中max函数已存的聚集计算结果与张三的年龄两者中的最大值,存储在tupleRow结构的第三列。
在上述实施例的基础上,本实施例还包括:若所述hash结构和所述内存中的tupleRowStream结构中至少一个未成功申请到内存,则将读取的所述原始数据存储到外存中的tupleRowStream结构中;其中,所述外存中的tupleRowStream结构与所述mdp数据结构的列数相同;相应地,直到所述mdp数据结构中的所有原始数据都进行聚集计算的步骤之后还包括:若所述内存的剩余大小大于预设大小,则将所述外存中预设大小的原始数据读取到所述内存中;对新读取到所述内存中的原始数据执行读取、分组、申请内存和聚集计算的步骤,直到所述外存中不存在原始数据。
其中,外存是指除计算机内存及CPU缓存以外的储存器,此类储存器一般断电后仍然能保存数据。常见的外存有硬盘、软盘、光盘、U盘等。外存中的tupleRowStream结构内部分为多个块block,每个block的大小是预先设定好的如默认是8M。这个block结构在创建的时候会将8M的内存申请好,这个结构不是把所有的数据都放到真正的外存,而是判断系统剩余内存能否存放下新的一行数据,如果不能存下,则把一个block放到外存。例如现在内存剩余9M,tupleRowStream中的数据大小为8M,如果再放一行数据,则tupleRowStream中的内存会达到10M,此时tupleRowStream会把它内部原有的8M数据真正的放到外存,即刷到硬盘。由于8M数据被刷到了硬盘,所以此时可以把新的一行的数据放到tupleRowStream结构中。
若剩余内存不足以存放新key值和新key值对应的聚集计算结果,即若hash结构和内存中的tupleRowStream结构中至少一个未成功申请到内存,则将读取的原始数据放到外存中的tupleRowStream结构中,等待下一次计算。外存中的tupleRowStream结构和内存中mdp结构的列数相同,用来保存原始数据。当mdp结构中的原始数据都被读取后,在hash结构中存在的key值对应的数据都经过了聚集函数的计算,存储在内存中的tupleRowStream中。此时该tupleRowStream中的一个tupleRow就是要输出的一行数据,所以可以直接把该tupleRowStream输出,但是输出的这些数据是一部分聚集计算结果,还有一部分没有计算的原始数据存储在外存的tupleRowStream中。由于这些key值的聚集计算结果占用大量内存,可以先把这部分聚集计算结果输出,再计算外存中的原始数据。最后将每次输出的聚集计算结果中同一key值的聚集计算结果进行聚集计算,得到最终的聚集计算结果。
存在外存中的原始数据,因为在读取原始数据后内存不足以放下原始数据所属分组的key值和key值所对应的聚集计算结果,所以存放在了外存中,等待内存中mdp结构中的原始数据计算完成之后再计算外存的原始数据。外存中的原始数据和mdp中的原始数据结构是一样的。首先将外存中的原始数据读到内存中,由于外存的原始数据量可能会很大,内存不足以一次性把外存的原始数据都读到内存。本发明实施例提供一个参数,即预设内存大小,代表一次从外存中读取多大的原始数据到内存。在读取外存数据时,先判断现有内存是否足以存放下预设大小的原始数据。如果剩余内存不足以存储预设大小的原始数据,则循环等待,直到剩余内存大小足以存储预设大小的外存原始数据,把外存预设大小的原始数据读到内存中。然后执行步骤S101-S103,直到外存中的所有原始数据都读取完。
本实施例在剩余内存不足以存储新key值和新key值所对应的聚集计算结果时,将读取的原始数据存储到外存,当内存中的所有原始数据计算完成后,再将外存中的原始数据读取到内存进行计算,从而尽量在一次计算中在内存中处理尽可能多的key值,充分利用了内存计算,显著的提高了计算效率。
在上述实施例的基础上,本实施例若为所述hash结构和所述内存中的tupleRowStream结构都成功申请到内存,则将所述key值存储到所述hash结构中,将所述原始数据经过所述SQL语句中的聚集函数计算获取的聚集计算结果存储到所述内存中的tupleRow结构中的步骤还包括:若为所述hash结构和所述内存中的tupleRowStream结构都成功申请到内存,且所述外存中不存有所述原始数据,则将所述key值存储到所述hash结构中,将所述原始数据经过所述SQL语句中的聚集函数计算获取的聚集计算结果存储到所述内存中的tupleRow结构中;若为所述hash结构和所述内存中的tupleRowStream结构都成功申请到内存,且所述外存中已存有原始数据,则将读取的所述原始数据存储到外存中的tupleRowStream结构中。
具体地,当外存中存有原始数据时,说明存在key值对应的原始数据放在外存没有进行聚集计算,即使key值对应的有些原始数据进行了聚集计算,但该不能一次性对key值对应的所有元素数据进行聚集计算,即聚集计算结果不完整。因此,当外存中存有原始数据,将读取的新key值对应的原始数据都保存到外存。使用一个bool类型的变量来记录是否有原始数据放到了外存,如果有,则bool类型变量为true。如果该bool变量为true,此时从MDP中拿出一个新的key值,如果这个key值不在hash结构中,即使此时内存足够放下这个新的key值及key值所对应的聚集计算结果,也不能计算该key值对应的原始数据,而是将该key值及对应的原始数据放到外存的tupleRowStream中。
例如,key值是1-20的数字,内存中的tupleRowStream中存放了key值等于1-10的值,当key值等于11的时候,现在的内存不够存储下key值的聚集计算结果,将key值等于11的原始数据放到外存,此后key值为11-20的原始数据都放到外存。假如在key值等于15的时候,内存的tupleRowStream是可以存放下这个数据的,也不放到内存的tupleRowStream中,而是放到外存的tupleRowStream。虽然放到了外存的tupleRowStream中,但是因为此时有足够的内存,所以这些数据没有真正的刷到硬盘上,仍然在内存中,这块内存就是外存的tupleRowStream所申请的。
在本发明的另一个实施例中提供一种大数据聚集计算装置,该装置用于实现前述各实施例中的方法。因此,在前述大数据聚集计算方法方法的各实施例中的描述和定义,可以用于本发明实施例中各个执行模块的理解。图2为本发明实施例提供的大数据聚集计算装置整体结构示意图,该装置包括分组模块201、申请模块202和存储模块203;其中:分组模块201用于从内存的mdp数据结构中读取任一行未进行聚集计算的原始数据,根据操作所述原始数据的SQL语句中的分组字段,对读取的所述原始数据进行分组;
其中,mdp数据结构是内存中传输数据的结构,可以从中取出一行数据,也可以取出一行中指定列的数据。mdp数据结构中存储的是原始数据,即没有经过分组和聚集计算的数据。mdp数据结构为一张二维表。分组模块201从mdp数据结构中每次读取一行未进行聚集计算的原始数据,可以任意读取,也可以按照某种排序读取。通过SQL语句中的分组字段对读取的一行原始数据进行分组
申请模块202用于若所述原始数据所属分组的key值在所述内存的hash结构中不存在,则为所述hash结构申请内存以存储所述key值,为所述内存中的tupleRowStream结构申请内存创建tupleRow结构以存储所述分组的聚集计算结果;
在mdp数据结构中读取到一行原始数据后并对其进行分组后,申请模块202在hash结构中查该行原始数据所属分组的key值在hash结构中是否已经存在。如果不存在,说明这是一个新的分组,需要在hash结构中存储新分组的key值和该新分组的聚集计算结果。此时的内存是否可以存储下这个新的key值和该key值对应的聚集计算结果,需要满足两个条件,即a、为hash结构向系统能申请到存储一个新key值的内存;b、为内存中的tupleRowStream结构也可以申请到内存来创建一个新的tupleRow结构以存储新key值对应的聚集计算结果。根据key值的类型,确定为hash结构申请内存的大小。根据聚集计算结果的类型,确定为内存中的tupleRowStream结构申请内存的大小。
存储模块203用于若为所述hash结构和所述内存中的tupleRowStream结构都成功申请到内存,则将所述key值存储到所述hash结构中,将所述原始数据经过所述SQL语句中的聚集函数计算获取的聚集计算结果存储到所述tupleRow结构中,直到所述mdp数据结构中的所有原始数据都进行聚集计算。
当这两个条件同时满足时,存储模块203将新的key值放入hash结构。使用聚集函数对读取的一行原始数据进行聚集计算,得到一行聚集计算结果,该行聚集计算结果的列数等于SQL语句中聚集函数的个数。将该行聚集计算结果存储到新建的tupleRow结构中。然后迭代执行读取原始数据、分组、申请内存和存储,直到mdp数据结构中的所有元素数据都进行聚集计算。
本实施例通过每读取一行为进行聚集计算的原始数据,就对该行数据进行分组,结合hash技术判断该行数据所属的分组是否为一个新分组,若为一个新分组则根据内存使用情况判断剩余内存是否可以存放下一个新分组的key值和聚集计算结果,若能存放下则进行聚集计算,并对聚集计算结果和key值进行保存,从而每读取到一行原始数据就实时根据内存情况进行聚集计算,最大限度地使用内存,提高了运算效率。
在上述实施例的基础上,本实施例中所述mdp数据结构为二维表结构;所述hash结构的key值为存储在所述hash结构中分组的key值,所述hash结构的key值对应的value值为tupleRow指针,所述tupleRow指针指向所述key值对应的聚集计算结果;所述内存中的tupleRowStream结构包含多个tupleRow结构,各所述tupleRow结构的列数等于所述聚集函数的个数,各所述tupleRow结构用于存储一个所述分组的聚集计算结果。
在上述实施例的基础上,本实施例中申请模块具体用于:根据所述key值的类型,确定为所述hash结构申请内存的大小;根据所述聚集计算结果的类型,确定为所述内存中的tupleRowStream结构申请内存的大小。
在上述实施例的基础上,本实施例中存储模块具体用于:若所述tupleRow结构中的任一列存储聚集函数count的聚集计算结果,则将该列的值初始化为1;若所述tupleRow结构中的任一列存储聚集函数sum的聚集计算结果,则将读取的所述原始数据中sum函数的参数字段对应的值作为该列的值;若所述tupleRow结构中的任一列存储聚集函数max的聚集计算结果,则将读取的所述原始数据中max函数的参数字段对应的值作为该列的值。
在上述各实施例的基础上,本实施例中还包括更新模块,用于:若所述原始数据所属分组的key值在所述内存的hash结构中存在,则使用所述聚集函数对读取的所述原始数据和所述key值对应的聚集计算结果进行聚集计算,获取最新的聚集计算结果;将所述最新的聚集计算结果作为所述key值对应的聚集计算结果。
在上述各实施例的基础上,本实施例中更新模块具体用于:若所述tupleRow结构中的任一列存储聚集函数count的聚集计算结果,则将该列中的聚集计算结果加1,获取该列最新的聚集计算结果;若所述tupleRow结构中的任一列存储聚集函数sum的聚集计算结果,则将该列中的聚集计算结果加上读取的所述原始数据中sum函数的参数字段对应的值,获取该列最新的聚集计算结果;若所述tupleRow结构中的任一列存储聚集函数max的聚集计算结果,则获取该列中的聚集计算结果与读取的所述原始数据中max函数的参数字段对应的值两者中的最大值,将所述最大值作为该列最新的聚集计算结果。
在上述实施例的基础上,本实施例中存储模块还用于:若所述hash结构和所述内存中的tupleRowStream结构中至少一个未成功申请到内存,则将读取的所述原始数据存储到外存中的tupleRowStream结构中;其中,所述外存中的tupleRowStream结构与所述mdp数据结构的列数相同;
相应地,还包括读取模块,用于若所述内存的剩余大小大于预设大小,则将所述外存中预设大小的原始数据读取到所述内存中;对新读取到所述内存中的原始数据执行读取、分组、申请内存和聚集计算的步骤,直到所述外存中不存在所述原始数据。
在上述实施例的基础上,本实施例中存储模块还用于:若为所述hash结构和所述内存中的tupleRowStream结构都成功申请到内存,且所述外存中不存有所述原始数据,则将所述key值存储到所述hash结构中,将所述原始数据经过所述SQL语句中的聚集函数计算获取的聚集计算结果存储到所述内存中的tupleRow结构中;若为所述hash结构和所述内存中的tupleRowStream结构都成功申请到内存,且所述外存中已存有所述原始数据,则将读取的所述原始数据存储到所述外存中的tupleRowStream结构中。
本实施例提供一种电子设备,图3为本发明实施例提供的电子设备整体结构示意图,该设备包括:至少一个处理器301、至少一个存储器302和总线303;其中,
处理器301和存储器302通过总线303完成相互间的通信;
存储器302存储有可被处理器301执行的程序指令,处理器调用程序指令能够执行上述各方法实施例所提供的方法,例如包括:从内存中读取任一行未进行聚集计算的原始数据,根据操作原始数据的SQL语句中的分组字段,对读取的所述原始数据进行分组;若所述原始数据所属分组的key值在所述内存的hash结构中不存在,则申请内存以存储key值和key值对应的聚集计算结果;若申请到内存,则将所述key值存储到所述hash结构中,将所述原始数据经过所述SQL语句中的聚集函数计算获取的聚集计算结果存储到申请的内存中,直到所述mdp数据结构中的所有原始数据都进行聚集计算。
本实施例提供一种非暂态计算机可读存储介质,非暂态计算机可读存储介质存储计算机指令,计算机指令使计算机执行上述各方法实施例所提供的方法,例如包括:从内存中读取任一行未进行聚集计算的原始数据,根据操作原始数据的SQL语句中的分组字段,对读取的所述原始数据进行分组;若所述原始数据所属分组的key值在所述内存的hash结构中不存在,则申请内存以存储key值和key值对应的聚集计算结果;若申请到内存,则将所述key值存储到所述hash结构中,将所述原始数据经过所述SQL语句中的聚集函数计算获取的聚集计算结果存储到申请的内存中,直到所述mdp数据结构中的所有原始数据都进行聚集计算。
本领域普通技术人员可以理解:实现上述方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成,前述的程序可以存储于一计算机可读取存储介质中,该程序在执行时,执行包括上述方法实施例的步骤;而前述的存储介质包括:ROM、RAM、磁碟或者光盘等各种可以存储程序代码的介质。
以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要读取其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性的劳动的情况下,即可以理解并实施。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到各实施方式可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件。基于这样的理解,上述技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在计算机可读存储介质中,如ROM/RAM、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行各个实施例或者实施例的某些部分所述的方法。
最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。
本文发布于:2023-04-14 03:34:03,感谢您对本站的认可!
本文链接:https://patent.en369.cn/patent/3/86394.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |