数据处理方法及装置与流程

文档序号:16880629发布日期:2019-02-15 22:06阅读:177来源:国知局
数据处理方法及装置与流程
本公开涉及大数据
技术领域
,具体而言,涉及一种数据处理方法及装置。
背景技术
:spark是一种基于内存的分布式计算框架,其中包括能够处理sql(structuredquerylanguage,结构化查询语言)语句的sparksql组件。在使用sparksql组件进行数据分析时,一个查询语句往往涉及到多个数据表的数据关联,从而需要在查询过程中对数据表进行连接(join),也即,将两个数据表中的每一行数据进行任意组合,形成临时的笛卡尔积表。相关技术中,在对两个数据表进行连接时,通常先将满足连接条件的数据拉取(shuffle)到同一分区中,再对数据进行连接。在连接完成后,该分区中的数量会倍增,导致该分区中的计算速度缓慢。技术实现要素:有鉴于此,本公开的目的在于提供一种数据处理方法及装置,以提高spark进行数据处理的速度。为了达到上述目的,本公开采用如下技术方案:第一方面,本公开提供一种数据处理方法,应用于spark中的查询优化器,所述方法包括:获得sql语句的原始逻辑计划树,所述原始逻辑计划树包括聚合节点、连接节点和表扫描节点,其中,所述连接节点为所述聚合节点的子节点;在所述连接节点连接的两个数据表中确定被所述聚合节点的聚合函数操作的数据表,从所确定的数据表中选取至少一个数据表作为第一数据表;创建与所述第一数据表对应的第一预聚合节点;将所述第一预聚合节点插入所述连接节点和与所述第一数据表对应的表扫描节点之间,得到优化的逻辑计划树。第二方面,本公开提供一种数据处理装置,应用于spark中的查询优化器,所述装置包括:获得模块,用于获得sql语句的原始逻辑计划树,所述原始逻辑计划树包括聚合节点、连接节点和表扫描节点;确定模块,用于在所述连接节点连接的两个数据表中确定被所述聚合节点的聚合函数操作的数据表,从所确定的数据表中选取至少一个数据表作为第一数据表;第一节点创建模块,用于创建与所述第一数据表对应的第一预聚合节点;第一节点插入模块,用于将创建的第一预聚合节点插入所述连接节点和与所述第一数据表对应的表扫描节点之间,得到优化的逻辑计划树。第三方面,本公开提供一种机器可读存储介质,其上存储有机器可执行指令,该机器可执行指令被执行时促使处理器实现本公开提供的数据处理方法。相对于现有技术而言,本公开具有以下有益效果:本公开提供的一种数据处理方法及装置,spark中的查询优化器获得sql语句的原始逻辑计划树,该原始逻辑计划树包括聚合节点、连接节点和表扫描节点,其中连接节点是聚合节点的子节点。在连接节点连接的两个数据表中确定被聚合节点的聚合函数操作的数据表,从所确定的数据表中选取至少一个数据表作为第一数据表。创建与第一数据表对应的第一预聚合节点,将创建的第一预聚合节点插入连接节点和与第一数据表中对应的表扫描节点之间,得到优化的逻辑计划树。如此,可以减少需要shuffle到同一分区中进行连接的数据量,以及减少对数据表进行连接后得到的数据量,从而提高spark进行数据处理的速度。附图说明为了更清楚地说明本公开的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,应当理解,以下附图仅示出了本公开的某些实施例,因此不应被看作是对范围的限定,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他相关的附图。图1为本公开提供的一种spark中的sparksql组件的框架示意图;图2为相关技术中的一种sql语句的逻辑计划树的示意图;图3为图2所示逻辑计划树对应的处理过程示意图;图4为本公开提供的一种数据处理方法的流程示意图;图5为本公开提供的一种示例中的优化的逻辑计划树的示意图;图6为本公开提供的又一示例中的优化的逻辑计划树的示意图;图7为本公开提供的又一示例中的优化的逻辑计划树的示意图;图8为本公开提供的数据处理方法的又一流程示意图;图9为本公开提供的又一示例中的优化的逻辑计划树的示意图;图10为本公开提供的一种服务器的方框示意图;图11为本公开提供的一种数据处理装置的功能模块框图。图标:10-服务器;11-处理器;12-机器可读存储介质;121-sparksql组件;1211-语言处理及执行器;1212-查询优化器;200-数据处理装置;210-获得模块;220-确定模块;230-第一节点创建模块;231-分组条件设置子模块;232-第一预聚合子模块;233-第二预聚合子模块;240-第一节点插入模块;250-第一更新模块;260-第二节点创建模块;270-第二节点插入模块;280-第二更新模块;1213-查询执行器;13-通信单元。具体实施方式为使本公开的目的、技术方案和优点更加清楚,下面将结合本公开中的附图,对本公开中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本公开的一部分实施例,而不是全部的实施例。通常在此处附图中描述和示出的本公开的组件可以以各种不同的配置来布置和设计。因此,以下对在附图中提供的本公开的实施例的详细描述并非旨在限制要求保护的本公开的范围,而是仅仅表示本公开的选定实施例。基于本公开中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本公开保护的范围。应注意到:相似的标号和字母在下面的附图中表示类似项,因此,一旦某一项在一个附图中被定义,则在随后的附图中不需要对其进行进一步定义和解释。如图1所示,是本公开提供的一种spark中的sparksql组件121的框架示意图,该sparksql组件121包括语言处理及执行器(languageprocessingandexecution,lpe)1211、查询优化器(queryoptimizer)1212以及查询执行器(queryexecutor)1213。其中,语言处理及执行器1211用于对sql语句进行解析得到一逻辑计划树,此时得到的逻辑计划树通常称作unresolved逻辑计划树。语言处理及执行器1211进一步对该unresolved逻辑计划树进行绑定(bind)得到一可执行的逻辑计划树(又称“resolved逻辑计划树”)。查询优化器1212用于根据配置的优化规则(rule)对所述可执行的逻辑计划树进行优化,得到优化的逻辑计划树,并根据优化的逻辑计划树生成对应的物理计划树。查询执行器1213用于执行所述物理计划树并返回相应的数据。经研究发现,如果sql语句为带有groupby语句(分组函数)的join(连接)语句,spark在执行该sql语句时,通常是先对数据表进行连接,再对连接得到的数据表进行分组,并对分组得到的每组数据进行聚合。在此需要说明的是,在sql语句中通常共同使用groupby语句和聚合函数,即按照指定字段对数据表中的数据进行分组,例如某一数据表中包括字段a和字段b,假设现在通过groupby语句将字段a相同的数据分为一组,则每组数据中的字段b的值可能不同,在此情况下,可以通过聚合函数对每组数据中的字段b进行处理,以使每组数据的字段b仅有一个值。其中,聚合函数包括用于求和的sum函数、用于求平均的avg函数、用于统计行数的count函数、用于确定最小值的min函数以及用于确定最大值的max函数。下面结合图2、图3及如下所示的数据表t1和数据表t2,对相关技术中处理带有groupby语句的join语句的过程进行详细描述。现对如上所示的表t1和表t2执行如下sql语句1:selectmin(t1.a1),min(t2.b3),t2.b1fromt1,t2wheret1.a2=t2.b2groupbyt2.b1sparksql组件121对上述sql语句1进行处理,可以得到如图2所示的原始逻辑计划树,所述原始逻辑计划树中包括用于获取表t1的数据的表扫描节点1,用于获取表t2的数据的表扫描节点2,用于对表t1和表t2进行连接的连接节点,用于对连接节点输出的笛卡尔积表进行聚合的聚合节点1以及用于从聚合节点1输出的数据表中获取所需数据的投影节点。sparksql组件121根据所述原始逻辑计划树生成对应的物理计划树,并通过查询执行器1213执行生成的物理计划树,从而得到对应的查询结果。其中,查询执行器1214执行该原始逻辑计划树对应的物理计划树的过程通常如图3所示,在执行过程中,先对表t1和表t2进行连接,得到图3中示出的临时的笛卡尔积表。在实际应用中,表t1和表t2中的数据通常分布在多个服务器节点上,需要将表t1和表t2中符合连接条件(即,t1.a2=t2.b2)的数据shuffle到同一服务器节点的同一分区中,才能进行连接(即求取笛卡尔积),进而对连接得到的笛卡尔积表中的数据进行分组和聚合。在进行连接后,所述同一分区中的数据量倍增,从而导致所述同一分区中的数据处理速度减缓。此外,在后续需要将数据shuffle到同一分区的操作中,例如聚合操作,由于笛卡尔积表的数据量较大,需要shuffle的数据量也较大。shuffle操作实际是将一个服务器节点上的数据通过网络传输到另一服务器节点,当需要shuffle的数据量大时,数据在网络中的传输时间也较长,将进一步导致spark的处理速度减缓。本公开提供一种数据处理方法及装置,在进行连接之前,对数据表进行预聚合,以减少连接操作的数据量,从而提高spark的数据处理速度。下面将对该内容进行详述。如图4所示,是本公开提供的一种数据处理方法的流程示意图,该数据处理方法可以应用于图1中示出的查询优化器1212,下面对该数据处理方法包括的步骤进行描述。步骤s41,获得sql语句的原始逻辑计划树,所述原始逻辑计划树包括聚合节点、连接节点和表扫描节点,其中,所述连接节点为所述聚合节点的子节点。其中,所述原始逻辑计划树可以是语言处理及执行器1211对unresolved逻辑计划树进行绑定后得到的resolved逻辑计划树,也可以是经查询优化器1212按照部分优化规则进行优化处理后的逻辑计划树。所述原始逻辑计划树通常包括多个节点,例如上述的聚合节点、连接节点和表扫描节点等,其中每个节点是一个逻辑计划(logicalplan),在某个节点之前执行的节点可以称为该节点的子节点或子逻辑计划(child逻辑计划)。在本实施例中,由于groupby语句通常与聚合函数共同使用,因而,带有groupby语句的join语句(下文称为“目标sql语句”)中通常包括聚合函数,例如sum函数、avg函数、count函数、min函数以及max函数等。对应地,目标sql语句的原始逻辑计划树中包括聚合(aggregate)节点,该聚合节点的节点信息中记录有groupby语句(分组函数)对数据表的操作字段、聚合函数及该聚合函数对数据表的操作字段。此外,目标sql语句的原始逻辑计划树还包括在聚合节点之前执行的连接(join)节点,即包括作为聚合节点的子节点的连接节点。基于上述描述,当确定某一sql语句的原始逻辑计划树中包括聚合节点,且该聚合节点的子节点是连接节点时,可以确定该sql语句为目标sql语句(带有groupby语句的join语句),从而可以通过后续步骤对该sql语句的原始逻辑计划树进行优化。以上述的sql语句1为例,在实施时,可以遍历图2中示出的原始逻辑计划树,从而确定该原始逻辑计划树包括聚合节点1,且该聚合节点1的子节点为连接节点,从而可以确定所述原始逻辑计划树对应的sql语句1为目标sql语句。步骤s42,在所述连接节点连接的两个数据表中确定被所述聚合节点的聚合函数操作的数据表,从所确定的数据表中选取至少一个数据表作为第一数据表。其中,连接节点通常用于连接两个数据表。在实际应用中,存在如下情形:第一、所述两个数据表其中之一被聚合函数操作,例如sql语句2:selectmin(t1.a1),t2.b1fromt1,t2wheret1.a2=t2.b2groupbyt2.b1,sql语句2中只包括一个聚合函数min(t1.a1),该聚合函数用于操作表t1;第二、所述两个数据表均被聚合函数操作,例如上述的sql语句1。在实施时,如果只有一个数据表被聚合函数操作,直接将该数据表选取为第一数据表,此时选取的第一数据表仅有一个。如果两个数据表均被聚合函数操作,可以将其中任意一个选取为第一数据表,此时选取的第一数据表仅有一个;也可以将两个数据表均选取为第一数据表,此时选取的第一数据表为两个。请返回参照图2,以图2中示出的sql语句1的原始逻辑计划树为例,可以确定该原始逻辑计划树的连接节点连接的两个数据表分别为表t1和表t2,再根据聚合节点1的节点信息确定聚合节点1中的聚合函数min(a1)用于操作表t1中的字段a1,聚合函数min(b3)用于操作表t2中的字段b3,从而可以确定被聚合节点1中的聚合函数操作的数据表为表t1和表t2。此时,在一种实施方式中,可以对表t1和表t2其中之一进行预聚合,也即,选取表t1和表t2其中之一作为本公开中的第一数据表,此时仅有一个第一数据表。如此,至少能够减少其中一个数据表的数据量。在又一种实施方式中,也可以对表t1和表t2两者进行预聚合,也即,选取表t1和表t2两者作为第一数据表,此时具有两个第一数据表。步骤s43,创建与所述第一数据表对应的第一预聚合节点。在该步骤s43中,针对所选取的每个第一数据表,创建与该第一数据表创建对应的第一预聚合节点。以上述sql语句1为例,如果所选取的第一数据表为表t1,则创建与表t1对应的第一预聚合节点。如果所选取的第一数据表为表t1和表t2,则创建与表t1对应的第一预聚合节点以及与表t2对应的第一预聚合节点,此时将创建两个第一预聚合节点。步骤s44,将所述第一预聚合节点插入到所述连接节点和与所述第一数据表对应的表扫描节点之间,得到优化的逻辑计划树。在本公开中,原始逻辑计划树中通常包括两个表扫描节点,分别用于获取所述连接节点连接的两个数据表中的数据,例如图2中示出的表扫描节点1用于获取表t1中的数据,表扫描节点2用于获取表t2中的数据。以图2示出的原始逻辑计划树为例,在实施时,将创建的与表t1对应的第一预聚合节点插入到连接节点和表扫描节点1之间,将创建的与表t2对应的第一预聚合节点插入到连接节点和表扫描节点2之间。在本公开中,第一预聚合节点中可以包括分组条件。对应地,步骤s42中可以包括设置分组条件的步骤,具体可以通过如下步骤一和步骤二实现:第一、若所述第一数据表没有被所述聚合节点中的分组函数操作,则从所述连接节点的连接条件中获取所述第一数据表的字段作为第一字段,将该第一字段设置为所述第一预聚合节点的分组条件。其中,分组函数是指groupby语句。如果sql语句中包括groupby语句,则在该sql语句的原始逻辑计划树的聚合节点中,存在分组条件,该分组条件包括groupby语句(分组函数)对数据表的操作字段,该操作字段所属的数据表即为被分组函数操作的数据表。在实施时,可以通过如下方式判断第一数据表是否被分组函数操作:获取聚合节点中的分组函数对数据表的操作字段,判断获取到的操作字段是否属于所述第一数据表;如果属于,则可以确定所述第一数据表被所述聚合节点中的分组函数操作;如果不属于,则可以确定所述第一数据表没有被所述聚合节点中的分组函数操作。下面通过具体例子对上述的步骤一进行描述:假设对表t1和表t2执行sql语句n:selectxxxfromt1,t2wheret1.a2=t2.b2groupbyt2.b1,其中,“xxx”表示需要获取的数据,如果“xxx”中包括操作表t1的聚合函数,则表t1可以被选取为第一数据表;如果“xxx”中包括操作表t2的聚合函数,则表t2可以被选取为第一数据表。基于此,当表t1被选取为第一数据表时,在为表t1创建对应的第一预聚合节点的过程中,查询优化器1212可以确定聚合节点1中的分组条件为字段b1,而字段b1不属于表t1,从而判定表t1没有被聚合节点1中的分组函数操作。在此情况下,查询优化器1212可以从连接条件t1.a2=t2.b2中获取表t1的字段a2作为第一字段,并且将第一字段(即,字段a2)设置为与表t1对应的第一预聚合节点的分组条件。通过上述设置,与表t1对应的第一预聚合节点可以按照字段a2(分组条件)对表t1进行分组,从而得到如下所示的表t1’。表t1’应当理解,以上所示的表t1’只是为了展示按照分组条件对表t1进行分组的过程,在处理过程中可以不必生成该表t1’。第二、若所述第一数据表被所述聚合节点中的分组函数操作,则获取所述分组函数对所述第一数据表的操作字段作为第二字段,从所述连接条件中获取所述第一数据表的字段作为第一字段,将该第一字段和该第二字段均设置为所述第一预聚合节点的分组条件。现仍旧通过上述的对表t1和表t2执行sql语句n的示例,对步骤二进行描述:当表t2被选取为第一数据表时,请参照图2所示的原始逻辑计划树,在创建与表t2对应的第一预聚合节点的过程中,查询优化器1212可以确定该原始逻辑计划树中的聚合节点1中的分组条件为字段b1,并判定字段b1属于表t2,从而确定表t2被聚合节点1中的分组函数操作。在此情况下,可以从连接条件t1.a2=t2.b2中获取表t2的字段b2作为第一字段,获取分组函数(groupby语句)对表t2的操作字段b1作为第二字段,并将获取的第一字段(字段b2)和第二字段(字段b1)均设置为与表t2对应的第一预聚合节点中的分组条件。通过上述设置,与表t2对应的第一预聚合节点可以按照字段b1和字段b2对表t2进行分组,得到如下所示的表t2’。表t2’对应地,以上所示的表t2’只是为了展示按照分组条件对表t2进行分组的过程,在处理过程中,可以不必生成该表。在本公开中,所述第一预聚合节点还可以包括预聚合函数。对应地,步骤s42中还可以包括设置预聚合函数的步骤。在相关技术中,目标sql语句的执行过程如下:第一,对两个数据表进行连接得到对应的笛卡尔积表;第二,对笛卡尔积表进行分组;第三,对分组得到的每组数据执行聚合函数。而在执行连接操作即计算笛卡尔积表的过程中,会将其中一个数据表的每行数据与另一数据表中的每行符合连接条件的数据进行连接。请返回参照图3,例如图3所示,表t1中的第1行数据(1,f)与表t2中的3行数据分别连接,得到连接后的3行数据。如果此时表t2被预聚合为只包括2行数据的预聚合表,则表t1的第1行数据与该预聚合表中的数据连接后的行数将减少,若目标sql语句中的聚合函数是sum函数,行数的减少将导致最终求得的和值出错。因此,在设置第一预聚合节点中的预聚合函数时,需要考虑操作所述第一数据表的聚合函数是否为sum函数,以避免最终输出的结果有误。基于此,可以通过如下步骤三和步骤四设置与所述第一数据表对应的第一预聚合节点中的预聚合函数:第三、当所述连接节点连接的两个数据表中、不同于所述第一数据表的第二数据表被所述聚合节点中的聚合函数操作、且操作所述第二数据表的聚合函数为sum函数时,将count函数和操作所述第一数据表的聚合函数均设置为所述第一预聚合节点的预聚合函数,其中,所述count函数操作的字段为所述连接条件中包括的所述第一数据表的字段。对应地,在上述情况下,本公开提供的数据处理方法还可以包括以下步骤:将所述聚合节点中操作所述第二数据表的聚合函数更新为对所述第一预聚合节点的count函数的预聚合结果和操作所述第二数据表的聚合函数的聚合结果进行聚合。在本公开中,所设置的预聚合函数作用于所述第一预聚合节点按照分组条件对第一数据表分组后得到的每组数据。下面通过具体例子来对上述的步骤三进行描述:假设对表t1和表t2执行sql语句3:selectsum(t1.a1),sum(t2.b3),t2.b1fromt1,t2wheret1.a2=t2.b2groupbyt2.b1。在此示例中,基于上述关于步骤s41和步骤s42的描述,可以确定表t1和表t2均被聚合节点中的聚合函数操作,因此表t1和表t2均可以被选取为第一数据表。假设表t1和表t2均被选取为第一数据表,则分别创建与表t1对应的第一预聚合节点(如图5所示的预聚合节点51),以及与表t2对应的第二预聚合节点(图5中示出的预聚合节点52)。创建预聚合节点51的过程如下:(1)根据上文关于分组条件的描述,可以将字段a2设置为预聚合节点51中的分组条件;(2)确定不同于表t1(第一数据表)的表t2(第二数据表)被聚合函数sum(t2.b3)操作,并确定操作表t2的聚合函数为sum函数,故将count函数和操作表t1的聚合函数sum(a1)设置为预聚合节点51的预聚合函数。其中,可以将连接条件t1.a2=t2.b2中包括的表t1的字段a2作为count函数的操作字段。通过上述过程创建的预聚合节点51可以按照字段a2对表t1分组,得到上文示出的表t1’,再将预聚合函数count(a2)和sum(a1)作用于表t1’中的每组数据,可以得到如下所示的预聚合表m31。在此值得说明的是,表t1’中仅包括一组数据。预聚合表m31sum(a1)count(a2)a263f创建预聚合节点52的过程与创建预聚合节点51的过程类似,在此不再详述。如图5所示,创建的预聚合节点52中的分组条件为字段b1和字段b2,预聚合函数为count(b2)和sum(b3)。如此,预聚合节点52可以按照字段b1和字段b2对表t2进行分组,得到上文示出的表t2’,并对表t2中的两组数据分别执行预聚合函数count(b2)和sum(b3),从而得到如下所示的预聚合表m32:预聚合表m32b1count(b2)b2sum(b3)q2f4w1f2将创建的预聚合节点51插入表扫描节点1和连接节点之间,将创建的预聚合节点52插入表扫描节点2和连接节点之间,再对聚合节点中的聚合函数进行更新,即可得到如图5中示出的优化的逻辑计划树。其中,对聚合节点中的聚合函数的更新过程可以如下:在聚合节点中,将操作表t1的sum函数更新为对预聚合节点51中的预聚合函数sum(a1)的预聚合结果和预聚合节点52中的预聚合函数count(b2)的预聚合结果进行聚合,在此将sum(a1)的预聚合结果表示为x1,将count(b2)的预聚合结果表示为x2,则可以将聚合节点中的聚合函数sum(t1.a1)更新为sum(x1*x2);将操作表t2的sum函数更新为对预聚合节点51中的预聚合函数count(a2)的预聚合结果和预聚合节点52中的预聚合函数sum(b3)的预聚合结果进行聚合,在此将count(a2)的预聚合结果表示为x3,将sum(b3)的预聚合结果表示为x4,则可以将聚合节点中的聚合函数sum(t2.b3)更新为sum(x3*x4)。在图5示出的优化的逻辑计划树中,连接节点对预聚合节点51输出的预聚合表m31和预聚合节点52输出的预聚合表m32进行连接,得到如下所示的笛卡尔积表:sum(a1)count(a2)b1count(b2)b2sum(b3)63q2f463w1f2应当理解,上表所示的笛卡尔积表仅仅是为了描述连接节点的处理过程。在实际处理过程中,可以不必生成该笛卡尔积表。聚合节点再按照更新后的聚合函数,对上表示出的笛卡尔积表中的相应字段进行聚合,从而得到如下输出表s3:输出表s3sum(a1)b1b2sum(b3)6*2=12qf4*3=126*1=6wf2*3=6第四、当所述连接节点连接的两个数据表中、不同于所述第一数据表的第二数据表没有被所述聚合节点中的聚合函数操作时,或当操作所述第二数据表的聚合函数不是sum函数时,将操作所述第一数据表的聚合函数设置为所述第一预聚合节点的预聚合函数。下面通过具体例子来对步骤四进行描述:在第一个示例中,假设对表t1和表t2执行上述的sql语句2:selectmin(t1.a1),t2.b1fromt1,t2wheret1.a2=t2.b2groupbyt2.b1在此示例中,可以确定被聚合节点中的聚合函数操作的数据表为表t1,故将表t1选取为第一数据表,则创建与表t1对应的第一预聚合节点(如图6示出的预聚合节点61)。创建预聚合节点61的过程可以如下:(1)参照上文关于分组条件的描述,可以确定预聚合节点61的分组条件为a2;(2)确定不同于表t1(第一数据表)的表t2(第二数据表)没有被聚合节点中的聚合函数操作,故将操作表t1的聚合函数min(a1)设置为预聚合节点61的预聚合函数。通过上述过程创建的预聚合节点61可以按照字段a2对表t1分组,得到上文示出的表t1’,再对表t1’中的每组数据执行min(a1),从而输出如下所示的预聚合表m21:预聚合表m21min(a1)a21f由于表t2没有被聚合函数操作,则t2未被选取为第一数据表,故不必为其创建第一预聚合节点。此外,在本公开中,当聚合节点中的聚合函数不是sum函数时,可以不必对其进行更新。因而,只需将创建的预聚合节点61插入连接节点和表扫描节点1之间,即可得到如图6所示的优化的逻辑计划树。在图6所示的优化的逻辑计划树中,连接节点对预聚合节点61输出的预聚合表m21和表t2进行聚合,可以得到如下所示的笛卡尔积表:min(a1)b1b2b31qf31wf21qf1再通过聚合节点中的聚合函数min(a1)和分组条件b1对上述笛卡尔积表中的min(a1)字段做进一步聚合,从而得到如下所示的输出表s2:输出表s2min(a1)b1b21qf1wf在第二个示例中,可以对表t1和表t2执行上述的sql语句1:selectmin(t1.a1),min(t2.b3),t2.b1fromt1,t2wheret1.a2=t2.b2groupbyt2.b1,在此情况下表t1和表t2可以被选取为第一数据表。如果只将表t1选取为第一数据表,则创建与表t1对应的第一预聚合节点(如图7所示的预聚合节点71)。创建预聚合节点71的过程可以如下:(1)参照上文所述,预聚合节点71的分组条件为a2;(2)确定不同于表t1(第一数据表)的表t2(第二数据表)被聚合函数min(t2.b3)操作,但该聚合函数不是sum函数,故将操作表t1的聚合函数min(a1)设置为预聚合节点71的预聚合函数。通过上述过程创建的预聚合节点71可以按照字段a2对表t1进行分组,得到表t1’,再对表t1’中的每组数据执行预聚合函数min(a1),最终输出的预聚合表与上一示例中的预聚合表m21相同。再将创建的预聚合节点71插入连接节点和表扫描节点1之间,即可得到图7所示的优化的逻辑计划树。在该优化的逻辑计划树中,连接节点的处理过程和图6所示的连接节点类似,区别在于,图7中示出的聚合节点的输出结果为如下所示的输出表s1:输出表s1min(a1)b1b2min(b3)1qf11wf2应当理解,如果将表t1和表t2两者均被选取为第一数据表,则需要分别为表t1和表t2创建对应的第一预聚合节点,具体创建过程与上述第一个示例中创建预聚合节点61的过程类似,在此不再赘述。在此情况下,聚合节点最终输出的结果与输出表s1一致。可选地,在本公开中,所述数据处理方法还可以包括如图8所示的步骤。步骤s81,当所述连接节点连接的两个数据表中、不同于所述第一数据表的第二数据表没有被所述聚合节点中的聚合函数操作、且操作所述第一数据表的聚合函数为sum函数时,为所述第二数据表创建第二预聚合节点。步骤s82,将所述第二预聚合节点插入所述连接节点和与所述第二数据表对应的表扫描节点之间。可选地,在本公开中,可以通过如下步骤为所述第二数据表创建第二预聚合节点:从所述连接条件中获取所述第二数据表的字段作为第三字段,获取所述聚合节点中的分组函数对所述第二数据表的操作字段作为第四字段,并将所述第三字段和所述第四字段均设置为所述第二预聚合节点的分组条件,将count函数设置为所述第二预聚合节点的预聚合函数,其中,所述count函数操作的字段为所述连接条件中包括的所述第二数据表的字段。在此情况下,所述数据处理方法还可以包括:将聚合节点中的操作所述第一数据表的聚合函数更新为对所述第一预聚合节点的聚合函数的预聚合结果和所述第二预聚合节点的count函数的预聚合结果进行聚合。下面通过具体例子来对上述步骤进行描述。假设对表t1和表t2执行sql语句4:selectsum(t1.a1),t2.b1fromt1,t2wheret1.a2=t2.b2groupbyt2.b1在此情况下,可以确定只有表t1被聚合节点中的聚合函数操作,故将表t1选取为第一数据表,并为其创建第一预聚合节点(如图9所示的预聚合节点91)。创建预聚合节点91的过程可以如下:(1)通过上文描述的方式可以确定,预聚合节点91的分组条件与图5所示的预聚合节点51相同,均为字段a2;(2)确定不同于表t1(第一数据表)的表t2(第二数据表)没有被所述聚合节点中的聚合函数操作,故将操作表t1的聚合函数sum(a1)设置为预聚合节点91的预聚合函数。通过以上过程创建的预聚合节点91可以输出如下所示的预聚合表m41:预聚合表m41sum(a1)a26f此外,在确定不同于表t1的表t2没有被所述聚合节点中的聚合函数操作时,还可以进一步确定操作表t1(第一数据表)的聚合函数为sum函数,因此,可以为表t2(第二数据表)创建第二预聚合节点(如图9所示的预聚合节点92)。创建预聚合节点92的过程可以如下:1)将连接条件中包括的表t2的字段b2以及分组条件中包括的表t2的字段b1共同设置为预聚合节点92的分组条件。如此,当预聚合节点92按照该分组条件对表t2分组时,可以得到上文示出的表t2’。2)将count函数设置为预聚合节点92的预聚合函数,且该count函数的操作字段为连接条件t1.a2=t2.b2中属于表t2的字段b2。如此,预聚合节点92可以对表t2’中的两组数据分别执行count(b2),从而可以得到如下所示的预聚合表m42:预聚合表m42b1numb2q2fw1f如此,只需将创建的预聚合节点91插入连接节点和表扫描节点1之间,将创建的预聚合节点92插入连接节点和表扫描节点2之间,再对聚合节点中的聚合函数sum(t1.a1)进行更新,即可得到如图9所示的优化的逻辑计划树。其中,更新过程可以如下:将聚合节点中的聚合函数sum(t1.a1)更新为对预聚合节点91(第一预聚合节点)中的预聚合函数sum(a1)的预聚合结果以及预聚合节点92(第二预聚合节点)中的预聚合函数count(b2)的预聚合结果进行聚合,如果将预聚合函数sum(a1)的预聚合结果表示为x1、将预聚合函数count(b2)的预聚合结果表示为x2,则可以将sum(t1.a1)更新为sum(x1*x2)。在图9示出的优化的逻辑计划树中,连接节点对预聚合表m41和预聚合表m42进行连接,得到如下所示笛卡尔积表:sum(a1)a2b1count(b2)b26fq2f6fw1f聚合节点对上表所示的笛卡尔积表中的sum(a1)和count(b2)进行聚合,可以得到如下所示的输出表s4:输出表s4sum(a1)b1b26*2=12qf6*1=6wf在本公开中,spark通常运行在服务器上,对应地,所述查询优化器1212也运行在服务器上。如图10所示,是本公开提供的一种服务器10的方框示意图。所述服务器10可以是一台独立的服务器,也可以是服务器集群,本公开对此不做限制。所述服务器10包括处理器11、机器可读存储介质12以及通信单元13。处理器11、机器可读存储介质12及通信单元13之间直接或间接地电性连接,以实现数据的传输或交互。例如,这些元件相互之间可以通过一条或多条通讯总线或信号线实现电性连接。并且,处理器11通过读取并执行与数据处理逻辑对应的机器可执行指令,处理器11可以执行上文描述的数据处理方法。本文中提到的机器可读存储介质12可以是任何电子、磁性、光学或其他物理存储装置,可以包含存储信息,如可执行指令、数据等。例如,机器可读存储介质12可以是:ram(randomaccessmemory,随机存取存储器)、易失存储器、非易失性存储器、闪存、存储驱动器(如硬盘驱动器)、固态硬盘、任何类型的存储盘(如光盘、dvd等),或者类似的存储介质,或者它们的组合。请参照图11,是本公开提供的一种数据处理装置200,该数据处理装置200包括至少一个可以以软件或固件(firmware)的形式存储于机器可读存储介质12中或固化在服务器10的操作系统(operatingsystem,os)中的软件功能模块。处理器11可以执行机器可读存储介质12中的可执行模块,例如执行数据处理装置200所包括的软件功能模块及计算机程序等。该数据处理装置200可以包括获得模块210、确定模块220、第一节点创建模块230以及第一节点插入模块240。获得模块210用于获得sql语句的原始逻辑计划树,所述原始逻辑计划树包括聚合节点、连接节点和表扫描节点,其中,所述连接节点为所述聚合节点的子节点。本实施例中,获得模块210可用于执行图4中示出的步骤s41,关于获得模块210的具体描述可参照对步骤s41的描述。确定模块220用于在所述连接节点连接的两个数据表中确定被所述聚合节点的聚合函数操作的数据表,从所确定的数据表中选取至少一个数据表作为第一数据表。本实施例中,确定模块220可用于执行图4中示出的步骤s42,关于确定模块220的描述具体可参对步骤s42的描述。第一节点创建模块230用于创建与所述第一数据表对应的第一预聚合节点。本实施例中,第一节点创建模块230可用于执行图4中示出的步骤s43,关于第一节点创建模块230的描述具体可参对步骤s43的描述。可选地,所述第一预聚合节点包括分组条件。在此情况下,第一节点创建模块230可以包括分组条件设置子模块231。分组条件设置子模块231用于当所述第一数据表没有被所述聚合节点中的分组函数操作时,从所述连接节点的连接条件中获取所述第一数据表的字段作为第一字段,将该第一字段设置为所述第一预聚合节点的分组条件;当所述第一数据表被所述聚合节点中的分组函数操作时,获取所述分组函数对所述第一数据表的操作字段作为第二字段,从所述连接条件中获取所述第一数据表的字段作为第一字段,将该第一字段和该第二字段均设置为所述第一预聚合节点的分组条件。可选地,所述第一预聚合节点还包括预聚合函数,在此情况下,第一节点创建模块230还可以包括第一预聚合子模块232。第一预聚合子模块232用于当所述连接节点连接的两个数据表中、不同于所述第一数据表的第二数据表被所述聚合节点中的聚合函数操作、且操作所述第二数据表的聚合函数为sum函数时,将count函数和操作所述第一数据表的聚合函数均设置为所述第一预聚合节点的预聚合函数,其中,所述count函数操作的字段为所述连接条件中包括的所述第一数据表的字段。在此情况下,数据处理装置200还可以包括第一更新模块250。第一更新模块250用于将所述聚合节点中操作所述第二数据表的聚合函数更新为对所述第一预聚合节点的count函数的预聚合结果和操作所述第二数据表的聚合函数的聚合结果进行聚合。可选地,第一节点创建模块230还可以包括第二预聚合子模块233。第二预聚合子模块233用于当所述连接节点连接的两个数据表中、不同于所述第一数据表的第二数据表没有被所述聚合节点中的聚合函数操作时,或当操作所述第二数据表的聚合函数不是sum函数时,将操作所述第一数据表的聚合函数设置为所述第一预聚合节点的预聚合函数。第一节点插入模块240用于将创建的第一预聚合节点插入到所述连接节点和所述原始逻辑计划树中用于获取所述第一数据表的数据的表扫描节点之间,得到优化的逻辑计划树。本实施例中,第一节点插入模块240可用于执行图4中示出的步骤s44,关于第一节点插入模块240的具体描述可参照对步骤s44的描述。可选地,本公开提供的数据处理装置200还可以包括第二节点创建模块260和第二节点插入模块270。其中,第二节点创建模块260用于当所述连接节点连接的两个数据表中、不同于所述第一数据表的第二数据表没有被所述聚合节点中的聚合函数操作、且操作所述第一数据表的聚合函数为sum函数时,为所述第二数据表创建第二预聚合节点。第二节点插入模块270用于将所述第二预聚合节点插入所述连接节点和所述第二数据表中对应的表扫描节点之间。可选地,所述第二节点创建模块260具体可以用于从所述连接条件中获取所述第二数据表的字段作为第三字段,获取所述聚合节点中的分组函数对所述第二数据表的操作字段作为第四字段,并将所述第三字段和所述第四字段均设置为所述第二预聚合节点的分组条件,将count函数设置为所述第二预聚合节点的预聚合函数,其中,所述count函数操作的字段为所述连接条件中包括的所述第二数据表的字段。在此情况下,所述数据处理装置200还可以包括第二更新模块280。第二更新模块280用于将所述聚合节点中的操作所述第一数据表的聚合函数更新为对所述第一预聚合节点的聚合函数的预聚合结果和所述第二预聚合节点的count函数的预聚合结果进行聚合。综上所述,本公开提供数据处理方法及装置,spark中的查询优化器获得sql语句的原始逻辑计划树,当获得的原始逻辑计划树包括聚合节点,且该聚合节点的子节点为连接节点时,在连接节点的数据表中确定被聚合节点中的聚合函数操作的至少一个第一数据表。根据连接节点的连接条件以及操作第一数据表的第一聚合函数,创建与第一数据表对应的第一预聚合节点。将创建的第一预聚合节点插入到连接节点和用于获取第一数据表中数据的表扫描节点之间,得到优化的逻辑计划树。如此,可以减少需要拉取到同一分区中进行连接的数据量,以及减少对数据表进行连接后得到的数据量,从而提高spark进行数据处理的速度。在本公开所提供的实施例中,应该理解到,所揭露的装置和方法,也可以通过其它的方式实现。以上所描述的装置实施例仅仅是示意性的,例如,附图中的流程图和框图显示了根据本申请的多个实施例的装置、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段或代码的一部分,所述模块、程序段或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现方式中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个连续的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或动作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。另外,在本公开各个实施例中的各功能模块可以集成在一起形成一个独立的部分,也可以是各个模块单独存在,也可以两个或两个以上模块集成形成一个独立的部分。所述功能如果以软件功能模块的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本公开的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本公开各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:u盘、移动硬盘、只读存储器(rom,read-onlymemory)、随机存取存储器(ram,randomaccessmemory)、磁碟或者光盘等各种可以存储程序代码的介质。需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。以上所述,仅为本申请的具体实施方式,但本申请的保护范围并不局限于此,任何熟悉本
技术领域
的技术人员在本申请揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本申请的保护范围之内。因此,本申请的保护范围应以权利要求的保护范围为准。当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1