一种数据查询方法及装置与流程

文档序号:26050515发布日期:2021-07-27 15:25阅读:60来源:国知局
本发明实施例涉及金融科技(fintech)领域,尤其涉及一种数据查询方法及装置。
背景技术
::随着计算机技术的发展,越来越多的技术应用在金融领域,传统金融业正在逐步向金融科技转变,但由于金融行业的安全性、实时性要求,也对技术提出的更高的要求。在金融领域,随着金融业务的不断扩展,金融业务数据的数量变多且数据的形式也变得多样,如此针对金融业务数据应用的要求也会变高,在此基础上,数据查询在金融业务上的应用也变得广泛。因此,如何进行及时有效地数据查询操作,以满足金融业务的需求就成为急需解决的问题。现有方案在针对客户端提交的数据查询脚本中涉及的多数据源进行混合查询计算时,通常基于数据查询引擎工具(比如presto或openlookeng),通过各数据源对应的数据源连接器获取各数据源的数据库表的全量数据,并针对各数据源的数据库表的全量数据进行混合计算,即可得到最终的查询结果。然而,这种处理方式一方面在对各数据源的数据库表的全量数据进行混合计算时需要消耗较多的计算资源,另一方面在获取各数据源的数据库表的全量数据时需要消耗较多的网络资源。综上,目前亟需一种数据查询方法,用以降低数据传输过程中所消耗的网络资源。技术实现要素:本发明实施例提供了一种数据查询方法及装置,用以降低数据传输过程中所消耗的网络资源。第一方面,本发明实施例提供了一种数据查询方法,包括:计算组件接收数据查询请求;所述数据查询请求中包括结构化查询语言sql数据查询脚本;所述计算组件对所述sql数据查询脚本进行语法解析,生成具有执行依赖关系的m个数据查询子任务;所述m个数据查询子任务中至少包括一个仅涉及单一数据源节点的第一数据查询子任务;所述计算组件将至少一个第一数据查询子任务分发给各自的数据源节点;所述数据源节点用于执行第一数据查询子任务并得到数据查询子结果;所述计算组件基于所述执行依赖关系和所述数据查询子结果,执行所述m个数据查询子任务中的第二数据查询子任务,得到数据查询结果;所述第二数据查询子任务涉及多个数据源节点。上述技术方案中,通过对sql数据查询脚本进行语法解析,生成具有执行依赖关系的m个数据查询子任务,且该m个数据查询子任务中至少包括一个仅涉及单一数据源节点的第一数据查询子任务,并将至少一个第一数据查询子任务分发给各自的数据源节点,以使各数据源节点执行各自接收到的第一数据查询子任务,得到数据查询子结果,而无需计算组件从sql数据查询脚本所涉及的各数据源节点中获取数据库表的全量数据在计算组件本地进行查询计算。然后,计算组件基于执行依赖关系和数据查询子结果,执行m个数据查询子任务中的第二数据查询子任务,即可得到所需的数据查询结果,如此,由于计算组件只是按照执行依赖关系基于数量较少的数据查询子结果(相比数据库表的全量数据,数据查询子结果的数量少很多)进行整合计算,因此可以减轻计算组件的计算压力。基于此,由于各数据源节点只是传输数据查询子结果给计算组件,并不是传输数据库表的全量数据,因此可以大大减少计算组件与各数据源节点之间的数据传输量,从而可以降低数据传输过程中所消耗的网络资源,从而可以解决现有技术中存在需要获取各数据源节点的数据库表的全量数据的问题。此外,由于该方案能够充分利用各数据源节点自身支持的计算能力来执行数据查询子任务,得到数据查询子结果,因此可以降低计算组件所消耗的计算资源,并可以减少针对计算组件的一些计算能力的开发,从而可以减少开发人员的工作量。可选地,所述计算组件对所述sql数据查询脚本进行语法解析,生成具有执行依赖关系的m个数据查询子任务,包括:所述计算组件按照语法解析规则,生成所述sql数据查询脚本的语法树;所述计算组件从所述语法树中确定仅涉及单一数据源节点的第一数据查询子任务;所述计算组件针对所述语法树中任一表连接关键词,通过所述表连接关键词对应的第一数据查询子任务的数据查询子结果构建第二数据查询子任务;所述计算组件根据各第一数据查询子任务和各第二数据查询子任务的执行顺序,确定具有执行依赖关系的m个数据查询子任务。上述技术方案中,通过基于sql数据查询脚本的语法树,可以及时准确地确定出第一数据查询子任务,并将第一数据查询子任务分发给对应的数据源节点进行执行,从而可以避免从sql数据查询脚本所涉及的各数据源节点中获取数据库表的全量数据。此外,通过表连接关键词对应的第一数据查询子任务的数据查询子结果构建出第二数据查询子任务,以便于计算组件基于执行依赖关系和数据查询子结果来执行该第二数据查询子任务,从而可以及时有效地得到所需的数据查询结果,如此即可减轻计算组件的计算压力。可选地,所述计算组件按照语法解析规则,生成所述sql数据查询脚本的语法树,包括:所述计算组件按照语法解析规则,依次解析出所述sql数据查询脚本中的各关键词;所述计算组件若确定解析出的表名关键词不符合表名命名规则,则对所述表名关键词按照所述语法解析规则继续解析,直至解析到符合表名命名规则的表名关键词,从而得到所述sql数据查询脚本的语法树。上述技术方案中,在确定解析出的表名关键词不符合表名命名规则时,可对表名关键词进行进一步解析,直至解析到符合表名命名规则的表名关键词,即可得到完整清晰的语法树,并基于该语法树可以拆分出多个数据查询子任务,如此也可以确定出需要数据源节点执行的数据查询子任务以及需要计算节点执行的数据查询子任务,从而可以为后续及时地确定出各数据源节点需要执行的数据查询子任务提供支持。可选地,通过如下方式确定数据源节点,包括:所述计算组件按照语法解析规则中的指定标签名,确定所述sql数据查询脚本中涉及的数据源节点;或所述计算组件按照语法解析规则中的表名规则,确定所述sql数据查询脚本中涉及的数据源节点。上述技术方案中,通过按照语法解析规则中的指定标签名或照语法解析规则中的表名规则,可以及时准确地确定出sql数据查询脚本中涉及的数据源节点。可选地,在生成具有执行依赖关系的m个数据查询子任务之后,还包括:所述计算组件为所述m个数据查询子任务中的至少一个第一数据查询子任务分别标注上对应的数据源节点标识;所述计算组件将第一数据查询子任务分发给各自的数据源节点,包括:针对每个第一数据查询子任务,所述计算组件基于所述第一数据查询子任务对应的数据源节点标识,将所述第一数据查询子任务分发给对应的数据源节点。上述技术方案中,通过对各第一数据查询子任务标注上对应的数据源节点标识,可以确保计算组件及时准确地将各第一数据查询子任务分发给各自对应的数据源节点,并可以避免计算组件在分发第一数据查询子任务时因无法识别第一数据查询子任务的归属而导致第一数据查询子任务分发给不匹配的数据源节点,而无法获取正确的数据查询结果。可选地,在所述计算组件对所述sql数据查询脚本进行语法解析之前,还包括:所述计算组件确定所述sql数据查询脚本可执行。上述技术方案中,在对sql数据查询脚本进行语法解析之前,通过确定sql数据查询脚本是否可执行,可以确保正确的sql数据查询脚本能够被成功执行而获取正确的数据查询结果,并可以避免sql数据查询脚本因不可执行而无法获取所需的数据查询结果。可选地,通过下述方式确定所述sql数据查询脚本是否可执行:所述计算组件通过设定的sql数据查询脚本校验规则,对所述sql数据查询脚本的语法和/或参数进行校验,从而确定所述sql数据查询脚本是否可执行。上述技术方案中,通过设定的sql数据查询脚本校验规则,对sql数据查询脚本的语法和/或参数进行校验,可以及时准确地确定sql数据查询脚本的语法和/或参数是否正确,从而可以及时有效地确定sql数据查询脚本是否可成功执行。第二方面,本发明实施例还提供了一种数据查询装置,包括:接收单元,用于接收数据查询请求;所述数据查询请求中包括结构化查询语言sql数据查询脚本;处理单元,用于对所述sql数据查询脚本进行语法解析,生成具有执行依赖关系的m个数据查询子任务;所述m个数据查询子任务中至少包括一个仅涉及单一数据源节点的第一数据查询子任务;将至少一个第一数据查询子任务分发给各自的数据源节点;所述数据源节点用于执行第一数据查询子任务并得到数据查询子结果;基于所述执行依赖关系和所述数据查询子结果,执行所述m个数据查询子任务中的第二数据查询子任务,得到数据查询结果;所述第二数据查询子任务涉及多个数据源节点。可选地,所述处理单元具体用于:按照语法解析规则,生成所述sql数据查询脚本的语法树;从所述语法树中确定仅涉及单一数据源节点的第一数据查询子任务;针对所述语法树中任一表连接关键词,通过所述表连接关键词对应的第一数据查询子任务的数据查询子结果构建第二数据查询子任务;根据各第一数据查询子任务和各第二数据查询子任务的执行顺序,确定具有执行依赖关系的m个数据查询子任务。可选地,所述处理单元具体用于:按照语法解析规则,依次解析出所述sql数据查询脚本中的各关键词;若确定解析出的表名关键词不符合表名命名规则,则对所述表名关键词按照所述语法解析规则继续解析,直至解析到符合表名命名规则的表名关键词,从而得到所述sql数据查询脚本的语法树。可选地,所述处理单元具体用于:按照语法解析规则中的指定标签名,确定所述sql数据查询脚本中涉及的数据源节点;或按照语法解析规则中的表名规则,确定所述sql数据查询脚本中涉及的数据源节点。可选地,所述处理单元还用于:在生成具有执行依赖关系的m个数据查询子任务之后,为所述m个数据查询子任务中的至少一个第一数据查询子任务分别标注上对应的数据源节点标识;所述处理单元具体用于:针对每个第一数据查询子任务,基于所述第一数据查询子任务对应的数据源节点标识,将所述第一数据查询子任务分发给对应的数据源节点。可选地,所述处理单元还用于:在对所述sql数据查询脚本进行语法解析之前,确定所述sql数据查询脚本可执行。可选地,所述处理单元具体用于:通过设定的sql数据查询脚本校验规则,对所述sql数据查询脚本的语法和/或参数进行校验,从而确定所述sql数据查询脚本是否可执行。第三方面,本发明实施例提供一种计算设备,包括至少一个处理器以及至少一个存储器,其中,所述存储器存储有计算机程序,当所述程序被所述处理器执行时,使得所述处理器执行上述第一方面任意所述的数据查询方法。第四方面,本发明实施例提供一种计算机可读存储介质,其存储有可由计算设备执行的计算机程序,当所述程序在所述计算设备上运行时,使得所述计算设备执行上述第一方面任意所述的数据查询方法。附图说明为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简要介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域的普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。图1为本发明实施例提供的一种数据查询系统架构的示意图;图2为本发明实施例提供的一种数据查询方法的流程示意图;图3为本发明实施例提供的一种基准语法树的示意图;图4为本发明实施例提供的一种针对sql数据查询脚本的语法树示意图;图5为本发明实施例提供的一种依赖树的结构示意图;图6为本发明实施例提供的另一种依赖树的结构示意图;图7为本发明实施例提供的一种数据查询装置的结构示意图;图8为本发明实施例提供的一种计算设备的结构示意图。具体实施方式为了使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明作进一步地详细描述,显然,所描述的实施例仅仅是本发明的一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其它实施例,都属于本发明保护的范围。为了便于理解本发明实施例,首先以图1中示出的系统结构为例说明适用于本发明实施例的数据查询系统架构。该数据查询系统架构可以应用于参与涉及多数据源的混合查询等。如图1所示,该数据查询系统架构可以包括客户端100、计算组件200和至少一个数据源节点(比如数据源节点301、数据源节点302和数据源节点303等)。其中,计算组件200可以包括任务接收校验模块201、任务解析编排模块202和任务分发模块203。客户端100与计算组件200进行连接,每个数据源节点可以与计算组件200进行连接,比如,可以通过有线方式连接,或者可以通过无线方式连接,本发明实施例对此并不作限定。此外,每个数据源节点可以包括至少一个数据库引擎。示例性地,比如数据源节点301可以包括sparkengine、hiveengine等数据库引擎;数据源节点302可以包括hbaseengine、hiveengine等数据库引擎;数据源节点303可以包括sparkengine、hbaseengine等数据库引擎。其中,客户端100用于在接收到用户提交的数据查询脚本后,将该数据查询脚本发送给计算组件200。其中,客户端100可以为终端上的客户端软件,该终端可以为手机、笔记本电脑、台式电脑、平板电脑等,本发明实施例对此并不作限定。计算组件200用于针对客户端100发送的结构化查询语言sql数据查询脚本进行语法解析,获取数据源信息,若该数据源信息涉及多个数据源,则可以将该数据查询脚本拆分为多个sql数据查询子脚本,并将需要发送给数据源节点执行的至少一个sql数据查询子脚本分发给各自对应的数据源节点。然后,按照该多个sql数据查询子脚本的查询依赖关系,将各数据源节点执行各自对应的数据查询子脚本后所得到的数据查询子结果进行整合处理,以便得到最终的目标数据查询结果。此外,在具体实施过程中,任务接收校验模块201首先对接收到的sql数据查询脚本进行校验,在校验成功后,通过任务解析编排模块202对该sql数据查询脚本进行语法解析,获取数据源信息,若该数据源信息涉及多个数据源,则可以将该数据查询脚本拆分为多个sql数据查询子脚本,并通过任务分发模块203将该多个sql数据查询子脚本分发给各自对应的数据源节点。其中,计算组件(比如linkis等)200提供了强大的连通、复用、编排、扩展和治理管控能力。通过计算组件200可以将应用层和引擎层解耦,简化了复杂的网络调用关系,降低了整体复杂度,同时节约了整体开发和维护成本。针对每个数据源节点,该数据源节点在接收到对应的sql数据查询子脚本后,执行该sql数据子查询脚本,得到数据查询子结果,并将数据查询子结果进行存储,比如将数据查询子结果存储至上下文context中。需要说明的是,上述图1所示的结构仅是一种示例,本发明实施例对此不做限定。基于上述描述,图2示例性的示出了本发明实施例提供的一种数据查询方法的流程,该流程可以由数据查询装置执行。如图2所示,该流程具体包括:步骤201,计算组件接收数据查询请求。步骤202,所述计算组件对所述sql数据查询脚本进行语法解析,生成具有执行依赖关系的m个数据查询子任务。步骤203,所述计算组件将至少一个第一数据查询子任务分发给各自的数据源节点。步骤204,所述计算组件基于所述执行依赖关系和所述数据查询子结果,执行所述m个数据查询子任务中的第二数据查询子任务,得到数据查询结果。上述步骤201中,计算组件可以接收用户在终端上的客户端上的数据查询请求。比如,用户可以通过手机上的客户端提交数据查询请求,或者可以通过笔记本电脑上的web(worldwideweb,万维网)界面提交数据查询请求,或者,可以通过计算组件所在系统提供的服务界面上直接实时编辑sql数据查询脚本,以生成数据查询请求,并将该数据查询请求在该服务界面进行上传。其中,数据查询请求可以包括sql数据查询脚本。上述步骤202中,计算组件对sql数据查询脚本进行语法解析,生成具有执行依赖关系的m个数据查询子任务。其中,m个数据查询子任务中至少可以包括一个仅涉及单一数据源节点的第一数据查询子任务;每个数据查询子任务中可以包括sql数据查询子脚本,也即是说,数据源节点在执行第一数据查询子任务时,执行的是第一数据查询子任务中的sql数据查询子脚本;或者计算组件在执行第二数据查询子任务时,执行的是第二数据查询子任务中的sql数据查询子脚本。具体地,计算组件按照语法解析规则,生成sql数据查询脚本的语法树,并从该语法树中确定出仅涉及单一数据源节点的第一数据查询子任务。再针对语法树中任一表连接关键词,通过表连接关键词对应的第一数据查询子任务的数据查询子结果构建第二数据查询子任务。然后,根据各第一数据查询子任务和各第二数据查询子任务的执行顺序,确定具有执行依赖关系的m个数据查询子任务。其中,表连接关键词可以包括leftjoin、rightjoin、innerjoin/join、fulljoin等。如此,通过基于sql数据查询脚本的语法树,可以及时准确地确定出第一数据查询子任务,并将第一数据查询子任务分发给对应的数据源节点进行执行,从而可以避免从sql数据查询脚本所涉及的各数据源节点中获取数据库表的全量数据。此外,通过表连接关键词对应的第一数据查询子任务的数据查询子结果构建出第二数据查询子任务,以便于计算组件基于执行依赖关系和数据查询子结果来执行该第二数据查询子任务,从而可以及时有效地得到所需的数据查询结果,如此即可减轻计算组件的计算压力。示例性地,针对某一sql数据查询脚本,通过sql数据查询脚本进行语法解析,生成sql数据查询脚本的语法树,并从该语法树中确定出两个数据查询子任务,即数据查询子任务a和数据查询子任务b。再通过表连接关键词(比如join)对应的数据查询子任务a的执行结果和数据查询子任务b的执行结果构建出数据查询子任务c。其中,数据查询子任务c的执行需要依赖数据查询子任务a的执行结果以及数据查询子任务b的数据查询子结果,比如数据查询子任务是在数据源节点a中执行的,数据查询子任务b是在数据源节点b中执行的,而数据查询子任务c是在计算组件中执行的。进一步地,在生成sql数据查询脚本的语法树时,可以按照语法解析规则,依次解析出所述sql数据查询脚本中的各关键词,若确定解析出的表名关键词不符合表名命名规则,则对表名关键词按照语法解析规则继续解析,直至解析到符合表名命名规则的表名关键词,从而得到sql数据查询脚本的语法树。基于此,在确定解析出的表名关键词不符合表名命名规则时,可对表名关键词进行进一步解析,直至解析到符合表名命名规则的表名关键词,即可得到完整清晰的语法树,并基于该语法树可以拆分出多个数据查询子任务,如此也可以确定出需要数据源节点执行的数据查询子任务以及需要计算节点执行的数据查询子任务,从而可以为后续及时地确定出各数据源节点需要执行的数据查询子任务提供支持。此外,在对sql数据查询脚本进行语法解析之前,需要确定sql数据查询脚本是否可执行,以便确保正确的sql数据查询脚本能够被成功执行而获取正确的数据查询结果,并可以避免sql数据查询脚本因不可执行而无法获取所需的数据查询结果。具体地,计算组件通过设定的sql数据查询脚本校验规则,对sql数据查询脚本的语法和/或参数进行校验,从而确定sql数据查询脚本是否可执行。如此,可以及时准确地确定sql数据查询脚本的语法和/或参数是否正确,从而可以及时有效地确定sql数据查询脚本是否可成功执行。上述步骤203中,计算组件将至少一个第一数据查询子任务分发给各自的数据源节点,以使各数据源节点执行接收到的第一数据查询子任务并得到数据查询子结果。具体地,在生成具有执行依赖关系的m个数据查询子任务之后,计算组件为m个数据查询子任务中的至少一个第一数据查询子任务分别标注上对应的数据源节点标识。针对每个第一数据查询子任务,计算组件基于所述第一数据查询子任务对应的数据源节点标识,将第一数据查询子任务分发给对应的数据源节点。如此,通过对各第一数据查询子任务标注上对应的数据源节点标识,可以确保计算组件及时准确地将各第一数据查询子任务分发给各自对应的数据源节点,并可以避免计算组件在分发第一数据查询子任务时因无法识别第一数据查询子任务的归属而导致第一数据查询子任务分发给不匹配的数据源节点,而无法获取正确的数据查询结果。此外,可以通过下述方式确定数据源节点:计算组件按照语法解析规则中的指定标签名,可以及时准确地确定sql数据查询脚本中涉及的数据源节点;或者,可以按照语法解析规则中的表名规则,可以及时准确地确定sql数据查询脚本中涉及的数据源节点。示例性地,假设有两个第一数据查询子任务,即数据查询子任务a和数据查询子任务b。其中,数据查询子任务a是发给数据源节点a(比如idc_a)进行执行,则可以为数据查询子任务a标注上idc_a的标识;数据查询子任务b是发给数据源节点b(比如idc_b)进行执行,则可以为数据查询子任务b标注上idc_b的标识。然后,在分发各第一数据查询子任务时,即可及时准确地将数据查询子任务a发送给idc_a对应的数据源节点a,可以及时准确地将数据查询子任务b发送给idc_b对应的数据源节点b。上述步骤204中,计算组件基于执行依赖关系和数据查询子结果,执行m个数据查询子任务中的第二数据查询子任务,得到数据查询结果。其中,第二数据查询子任务涉及多个数据源节点。示例性地,针对某一sql数据查询脚本,通过sql数据查询脚本进行语法解析,生成具有依赖关系的三个数据查询子任务,即数据查询子任务a、数据查询子任务b和数据查询子任务c。其中,数据查询子任务c的执行需要依赖数据查询子任务a的执行结果以及数据查询子任务b的数据查询子结果。如此,计算组件即可基于数据查询子任务a、数据查询子任务b和数据查询子任务c之间的依赖关系,以及数据查询子任务a的执行结果和数据查询子任务b的执行结果,执行数据查询子任务c,从而可以准确地得到用户所需的数据查询结果。基于此,下面对本发明实施例中数据查询方法的实施过程进行具体描述。step1:计算组件针对客户端提交的数据查询脚本进行校验。其中,计算组件可以设置在一台独立的物理机上,或者可以设置在多个物理服务器构成的服务器集群或者分布式系统上,本发明实施例对此并不作限定。具体实施过程中,用户在需要进行数据查询时,可以通过终端上的客户端向计算组件中的任务接收校验模块提交数据查询请求,该数据查询请求中可以包括已经预先编辑好的sql数据查询脚本。计算组件在接收到数据查询请求后,从数据查询请求中解析出sql数据查询脚本。或者,用户可以在计算组件所在系统提供的服务界面上直接实时编辑sql数据查询脚本或直接输入已预先编辑好的sql数据查询脚本。其中,计算组件所在系统提供的服务界面可以通过终端上的客户端进行显示。然后,计算组件中的任务接收校验模块会对用户提交的sql数据查询脚本进行校验,以确定用户提交的sql数据查询脚本是否可成功执行,比如,对sql数据查询脚本的语法和/或参数等进行校验。step2:计算组件针对校验通过的sql数据查询脚本进行语法解析,生成至少一个数据查询子脚本。具体地,计算组件中的任务解析编排模块在接收到sql数据查询脚本后,按照sql语法解析规则,对该sql数据查询脚本进行语法解析,解析出该sql数据查询脚本所涉及的至少一个数据源,再基于该至少一个数据源将该sql数据查询脚本划分为多个步骤执行。也即是,基于该至少一个数据源将该sql数据查询脚本划分为多个sql数据查询子脚本,并针对该多个sql数据查询子脚本中需要发送给数据源节点执行的至少一个sql数据查询子脚本,将需要发送给数据源节点的至少一个sql数据查询子脚本分别生成对应的sql数据查询子任务,将该多个sql数据查询子脚本中不需要发送给数据源节点的至少一个sql数据查询子脚本分别生成对应的sql数据查询子任务保存在本地。同时将需要发送给数据源节点的sql数据查询子任务标注上对应的数据源标签,比如标注上idc(internetdatacenter,数据中心,也可称为机房或计算中心)1或idc2等,当然,也可以标注上具体执行sql数据查询子任务的数据库引擎,比如标注上engine1或engine2等。比如,engine1可以用于表示数据库引擎sparkengine或hiveengine等,engine2可以用于表示数据库引擎hiveengine或sparkengine、等;或者,engine1可以用于表示数据库引擎sparkengine或hbaseengine等,engine2可以用于表示数据库引擎hbaseengine或sparkengine等;或者,engine1可以用于表示数据库引擎hiveengine或hbaseengine等,engine2可以用于表示数据库引擎hbaseengine或hiveengine等,本发明实施例对此并不作限定。示例性地,假设有两个sql数据查询子任务(比如sql数据查询子任务a和sql数据查询子任务b)需要发送给对应的数据源节点,即,sql数据查询子任务a需要发送给数据源节点a(比如idc1_engine1),sql数据查询子任务b需要发送给数据源节点b(比如idc2_engine2),则可以为sql数据查询子任务a标注上数据源标签idc1_engine1,为sql数据查询子任务b标注上idc2_engine2。示例性地,假设某一sql数据查询脚本所涉及两个数据源,即数据源a和数据源b。基于该两个数据源可以将该sql数据查询脚本划分为多个数据查询步骤(比如stage1、stage2和stage3)执行。也即是,基于该两个数据源将该sql数据查询脚本划分为对应的多个sql数据查询子脚本,即,基于数据源a和数据源b,从该sql数据查询脚本中划分出sql数据查询子脚本a、sql数据查询子脚本b以及sql数据查询子脚本c。基于此,相比现有方案中需要在数据查询引擎工具中执行整个sql数据查询脚本,并需要读取该sql数据查询脚本所涉及的至少一个数据源的数据库表中的全量数据,而本方案不需要读取各数据源节点的数据库表中的全量数据,将整个sql数据查询脚本拆分为多个sql数据查询子脚本,并将需要各数据源节点执行的至少一个sql数据查询子脚本分发给对应的数据源节点,依靠各数据源节点自身支持的计算能力来执行对应sql数据查询子脚本,可以使得各数据源节点自身支持的计算能力得到充分利用,降低计算组件所消耗的计算资源,并可以减少针对计算组件的一些计算能力的开发。下面对基于sql语法解析规则对sql数据查询脚本进行解析的具体过程进行描述。步骤a、计算组件中的任务解析编排模块完成针对sql数据查询脚本的数据源解析。具体地,可以通过两种实现方式来获取sql数据查询脚本所涉及的数据源信息。第一种实现方式为:用户在提交的数据查询请求中指定对应的数据源标签信息,则可以直接通过数据源标签信息获取到对应的数据源信息。也即是说,用户需要在数据源标签信息中指定涉及到的数据库表名和数据源信息。示例性地,比如用户提交的数据查询请求中,包括某一sql数据查询脚本:select*fromtableajointablebontablea.c1=tableb.c2,以及该sql数据查询脚本所涉及的数据源标签信息为tablea-idc1_hive-db1和tableb-idc2_hbase-db1。其中,该数据源标签信息的含义为:数据库表名-数据源名-数据库名。即,tablea用于表示数据库表名,idc1_hive用于表示数据源名,db1用于表示hive中的数据库名;tableb用于表示数据库表名,idc2_hbase用于表示数据源名,db1用于表示hbase中的数据库名。第二种实现方式为:用户在提交的sql数据查询脚本中的数据库表名中指定了对应的数据源信息,则可以通过解析sql数据查询脚本获取对应的数据源信息。也即是说,需要用户在数据库表名中指定数据源名、数据库名等信息。示例性地,比如用户提交的某一sql数据查询脚本为:select*fromidc1_hive.db1.tableatableajoinidc2_hbase.db1.tablebtablebontablea.c1=tableb.c2。其中,用户在sql数据查询脚本中指定包含有数据源信息的表名规则为:数据源名.数据库名.数据库表名。即,在该sql数据查询脚本所涉及的第一个数据源中,idc1_hive用于表示数据源名,db1用于表示hive中的数据库名,tablea用于表示数据库表名;在该sql数据查询脚本所涉及的第二个数据源中,idc2_hbase用于表示数据源名,db1用于表示hbase中的数据库名,tableb用于表示数据库表名。通过上述两种实现方式获取到sql数据查询脚本所涉及的数据源信息后,会和计算组件中的数据源模块datasource(图1中未示出)进行映射,获取到对应的数据源的真实信息。步骤b、计算组件中的任务解析编排模块生成针对sql数据查询脚本的依赖树。在获取到sql数据查询脚本所涉及的数据源信息后,若该数据源信息只涉及一个数据源,即,该sql数据查询脚本并不涉及数据混合查询,则不需要生成针对sql数据查询脚本的依赖树,可直接基于该sql数据查询脚本生成对应的sql数据查询任务,并将该sql数据查询任务分发给对应的数据源节点,以便数据源节点执行该sql数据查询任务中的sql数据查询脚本,得到数据查询结果并进行缓存。若该数据源信息涉及两个或两个以上数据源,则该sql数据查询脚本涉及数据混合查询,需要生成针对sql数据查询脚本的依赖树。即,通过基于sql数据查询脚本所涉及的多个数据源,将sql数据查询脚本进行解析拆分,确定出多个sql数据查询子脚本。具体地,计算组件中的任务解析编排模块可以按照sql语法解析规则,sql数据查询脚本进行解析拆分,以此可得到多个sql数据查询子脚本。其中,参考图3,图3为本发明实施例提供的一种基准语法树的示意图。sql语法解析规则采用的是自顶向下的分析方法去做词法分析,词法分析工具将按照select、from、join、where等token对sql数据查询脚本进行解析。基于图3所示,从左到右按字符输入,并按照最左推导为终结符,将sql数据查询脚本解析为对应的语法树。示例性地,以用户提交的某一sql数据查询脚本:select*fromidc1_hive.db1.tableatableajoinidc2_hbase.db1.tablebtablebontablea.c1=tableb.c2wheretablea.id>1andtableb.id>1为例进行描述。词法分析工具按照select、from、join、where等token对该sql数据查询脚本进行解析,先解析出对应的数据源信息(比如idc1_hive和idc2_hbase),再解析出对应的查询条件(比如wheretablea.id>1andtableb.id>1),可以得到对应的如图4所示的语法树。然后,基于该sql数据查询脚本对应的语法树,即可生成如图5所示的涉及多个数据查询步骤(即多个sql数据查询子脚本)的依赖树。基于图5,计算组件中的任务解析编排模块通过基于sql数据查询脚本所涉及的多个数据源,将sql数据查询脚本进行解析拆分,确定出多个数据查询步骤,即stage1、stage2和stage3。其中,stage1为执行sql数据查询子脚本a(即执行select*fromidc1_hive.db1.tableatableawheretablea.id>1);stage2为执行sql数据查询子脚本b(即执行select*fromidc2_hbase.db1.tablebtablebwheretableb.id>1);stage3为执行sql数据查询子脚本c(即执行select*fromcstableaajoincstablebbona.c1=b.c1)。需要说明的是,stage1是在数据源节点idc1_hive中执行,stage2是在数据源节点idc2_hbase中执行,stage3是在计算组件中执行。而且,stage3是基于stage1的执行结果cstablea以及stage2的执行结果cstableb在计算组件中执行的。进一步地,下面通过一条较为复杂的sql数据查询脚本来对sql数据查询脚本的解析过程进行描述。示例性地,该较为复杂的sql数据查询脚本是将数据源es中xx城市(比如城市a)的成年人与数据源hive中xx城市(比如城市a)的成年人名字相同的人查询出来。其中,该较为复杂的sql数据查询脚本为:针对上述较为复杂的sql数据查询脚本,词法分析工具按照select、from、join、where等token对该较为复杂的sql数据查询脚本进行解析,先解析出对应的数据源信息(比如idc1_es、idc2_hive1和idc2_hive2),再解析出对应的查询条件(比如wherees_tablea.age>18andhive_tableb.age>18),可以得到对应的语法树。然后,基于该较为复杂的sql数据查询脚本对应的语法树,即可生成如图6所示的涉及多个数据查询步骤(即多个sql数据查询子脚本)的依赖树。基于图6,计算组件中的任务解析编排模块通过基于该较为复杂的sql数据查询脚本所涉及的多个数据源,将该较为复杂的sql数据查询脚本进行解析拆分,确定出多个数据查询步骤,即stage1、stage2、stage3、stage4和stage5。具体地,首先通过该较为复杂的sql数据查询脚本的外层的join条件解析出两个数据查询步骤(即stage1和stage*),并接着解析出最外层的where条件,再下推到对应的join两边的子查询里。然后,接着由于第二个数据查询步骤(即stage*)里还存在混合查询的join,继续解析生成两个数据查询步骤(即stage2和stage3),在执行stage2和stage3时将stage2和stage3的混合查询结果存储至cstabled,以便stage4基于该cstabled执行sql数据查询子脚本4。最后,stage5基于stage1的执行结果以及stage4的执行结果得到最终的目标数据查询结果。其中,stage1为执行sql数据查询子脚本1(即执行selectname,age,areafromidc1_es.es1.tableatableawheretablea.area=’城市a’andtablea.age>18);stage2为执行sql数据查询子脚本2(即执行selecttableb.name,tableb.agefromidc2_hive1.hive1.tablebtablebwheretableb.age>18);stage3为执行sql数据查询子脚本3(即执行selecttablec.name,tablec.areafromidc2_hive2.hive2.tablectablecwheretablec.area=’城市a’);stage4为执行sql数据查询子脚本4(即执行selectb.name,b.age,c.areafromcstablebbjoincstablecconb.name=c.name);stage5为执行sql数据查询子脚本5(即执行selecta.name,a.age,a.areafromcstableaajoincstableddona.name=d.name)。需要说明的是,stage1是在数据源节点idc1_es中执行,stage2是在数据源idc2_hive中执行,stage3是在idc2_hive中执行,stage4和stage5是在计算组件中执行。而且,stage4是基于stage2的执行结果cstableb以及stage3的执行结果cstablec在计算组件中执行的;stage5是基于stage1的执行结果cstablea以及stage4的执行结果cstabled在计算组件中执行的。step3:计算组件将至少一个sql数据查询子脚本封装为对应的数据查询子任务,并将至少一个数据查询子任务分发给各自对应的数据源节点。继续以上述图5所示的示例为例进行描述,将stage1和stage2分别封装为对应的sql数据查询子任务,即sql数据查询子任务a和sql数据查询子任务b,并为每个sql数据查询子任务标注上对应的数据源标签以及数据库引擎标签,比如,为sql数据查询子任务a标注上idc1_hive,为sql数据查询子任务b标注上idc2_hbase。然后,将sql数据查询子任务a分发给对应的数据源节点idc1_hive,将sql数据查询子任务b分发给对应的数据源节点idc2_hbase。同时,将sql数据查询子脚本c生成对应的sql数据查询子任务c存储在计算组件本地,并在检测到sql数据查询子任务a和sql数据查询子任务b在各自的数据源节点执行完成后(或者各数据源节点可以在执行各自的sql数据查询子任务完成后,将执行完成的消息通知计算组件,或者各数据源节点可以在执行各自的sql数据查询子任务完成后,将各自的执行结果发送给计算组件),再基于sql数据查询子任务a的执行结果以及sql数据查询子任务b的执行结果执行sql数据查询子任务c,得到最终的目标数据查询结果。或者,继续以上述图6所示的示例为例进行描述,将stage1、stage2和stage3分别封装为对应的sql数据查询子任务,即sql数据查询子任务1、sql数据查询子任务2和sql数据查询子任务3,并为每个sql数据查询子任务标注上对应的数据源标签以及数据库引擎标签,比如,为sql数据查询子任务1标注上idc1_es,为sql数据查询子任务2标注上idc2_hive1,为sql数据查询子任务3标注上idc2_hive2。然后,将sql数据查询子任务1分发给对应的数据源节点idc1_es,将sql数据查询子任务2分发给对应的数据源节点idc2_hive1,将sql数据查询子任务3分发给对应的数据源节点idc2_hive2。同时,将sql数据查询子脚本4和sql数据查询子脚本5分别生成对应的sql数据查询子任务4、sql数据查询子任务5保存在计算组件本地,并在检测到sql数据查询子任务1、sql数据查询子任务2和sql数据查询子任务3在各自的数据源节点执行完成后(或者各数据源节点可以在执行各自的sql数据查询子任务完成后,将执行完成的消息通知计算组件,或者各数据源节点可以在执行各自的sql数据查询子任务完成后,将各自的执行结果发送给计算组件),再基于sql数据查询子任务2的执行结果以及sql数据查询子任务3的执行结果执行sql数据查询子任务4,然后在检测到sql数据查询子任务4执行完成后,基于sql数据查询子任务1的执行结果以及sql数据查询子任务4的执行结果执行sql数据查询子任务5,得到最终的目标数据查询结果。基于此,相比现有方案中的数据查询引擎工具需要去对应的数据源节点中读取对应的数据库表的全量数据后,再基于该读取的数据库表的全量数据进行计算,而本方案利用各数据源节点自身支持的计算能力来执行sql数据查询子脚本,有助于降低计算组件所消耗的计算资源,并可以减少读取数据库表的全量数据的传输过程中所消耗的网络资源。step4:每个数据源节点接收对应的数据查询子任务,并执行数据查询子任务中的sql数据查询子脚本。针对每个数据源节点,数据源节点在接收到数据查询子任务后,解析该数据查询子任务,得到对应的sql数据查询子脚本,然后执行该sql数据查询子脚本。示例性地,继续以上述图5所示的示例为例进行描述,数据源节点idc1_hive在接收到sql数据查询子任务a后,解析该sql数据查询子任务a,得到sql数据查询子脚本a,然后执行该sql数据查询子脚本a,并将执行后的执行结果存储至上下文cstablea中。数据源节点idc2_hbase在接收到sql数据查询子任务b后,解析该sql数据查询子任务b,得到sql数据查询子脚本b,然后执行该sql数据查询子脚本b,并将执行后的执行结果存储至上下文cstableb中。然后,计算组件基于sql数据查询子任务a的执行结果以及sql数据查询子任务b的执行结果执行sql数据查询子任务c,得到最终的目标数据查询结果。或者,继续以上述图6所示的示例为例进行描述,数据源节点idc1_es在接收到sql数据查询子任务1后,解析该sql数据查询子任务1,得到sql数据查询子脚本1,然后执行该sql数据查询子脚本1,并将执行后的执行结果存储至上下文cstablea中。数据源节点idc2_hive1在接收到sql数据查询子任务2后,解析sql数据查询子任务2,得到sql数据查询子脚本2,然后执行该sql数据查询子脚本2,并将执行后的执行结果分别存储至上下文cstableb。数据源节点idc2_hive2在接收到sql数据查询子任务3后,解析sql数据查询子任务3,得到sql数据查询子脚本3,然后执行该sql数据查询子脚本3,并将执行后的执行结果分别存储至上下文cstablec中。然后,计算组件基于sql数据查询子任务2的执行结果以及sql数据查询子任务3的执行结果执行sql数据查询子任务4,并在检测到sql数据查询子任务4执行完成后,基于sql数据查询子任务1的执行结果以及sql数据查询子任务4的执行结果执行sql数据查询子任务5,得到最终的目标数据查询结果。上述实施例表明,通过对sql数据查询脚本进行语法解析,生成具有执行依赖关系的m个数据查询子任务,且该m个数据查询子任务中至少包括一个仅涉及单一数据源节点的第一数据查询子任务,并将至少一个第一数据查询子任务分发给各自的数据源节点,以使各数据源节点执行各自接收到的第一数据查询子任务,得到数据查询子结果,而无需计算组件从sql数据查询脚本所涉及的各数据源节点中获取数据库表的全量数据在计算组件本地进行查询计算。然后,计算组件基于执行依赖关系和数据查询子结果,执行m个数据查询子任务中的第二数据查询子任务,即可得到所需的数据查询结果,如此,由于计算组件只是按照执行依赖关系基于数量较少的数据查询子结果(相比数据库表的全量数据,数据查询子结果的数量少很多)进行整合计算,因此可以减轻计算组件的计算压力。基于此,由于各数据源节点只是传输数据查询子结果给计算组件,并不是传输数据库表的全量数据,因此可以大大减少计算组件与各数据源节点之间的数据传输量,从而可以降低数据传输过程中所消耗的网络资源,从而可以解决现有技术中存在需要获取各数据源节点的数据库表的全量数据的问题。此外,由于该方案能够充分利用各数据源节点自身支持的计算能力来执行数据查询子任务,得到数据查询子结果,因此可以降低计算组件所消耗的计算资源,并可以减少针对计算组件的一些计算能力的开发,从而可以减少开发人员的工作量。基于相同的技术构思,图7示例性的示出了本发明实施例提供的一种数据查询装置,该装置可以执行数据查询方法的流程。如图7所示,该装置包括:接收单元701,用于接收数据查询请求;所述数据查询请求中包括结构化查询语言sql数据查询脚本;处理单元702,用于对所述sql数据查询脚本进行语法解析,生成具有执行依赖关系的m个数据查询子任务;所述m个数据查询子任务中至少包括一个仅涉及单一数据源节点的第一数据查询子任务;将至少一个第一数据查询子任务分发给各自的数据源节点;所述数据源节点用于执行第一数据查询子任务并得到数据查询子结果;基于所述执行依赖关系和所述数据查询子结果,执行所述m个数据查询子任务中的第二数据查询子任务,得到数据查询结果;所述第二数据查询子任务涉及多个数据源节点。可选地,所述处理单元702具体用于:按照语法解析规则,生成所述sql数据查询脚本的语法树;从所述语法树中确定仅涉及单一数据源节点的第一数据查询子任务;针对所述语法树中任一表连接关键词,通过所述表连接关键词对应的第一数据查询子任务的数据查询子结果构建第二数据查询子任务;根据各第一数据查询子任务和各第二数据查询子任务的执行顺序,确定具有执行依赖关系的m个数据查询子任务。可选地,所述处理单元702具体用于:按照语法解析规则,依次解析出所述sql数据查询脚本中的各关键词;若确定解析出的表名关键词不符合表名命名规则,则对所述表名关键词按照所述语法解析规则继续解析,直至解析到符合表名命名规则的表名关键词,从而得到所述sql数据查询脚本的语法树。可选地,所述处理单元702具体用于:按照语法解析规则中的指定标签名,确定所述sql数据查询脚本中涉及的数据源节点;或按照语法解析规则中的表名规则,确定所述sql数据查询脚本中涉及的数据源节点。可选地,所述处理单元702还用于:在生成具有执行依赖关系的m个数据查询子任务之后,为所述m个数据查询子任务中的至少一个第一数据查询子任务分别标注上对应的数据源节点标识;所述处理单元702具体用于:针对每个第一数据查询子任务,基于所述第一数据查询子任务对应的数据源节点标识,将所述第一数据查询子任务分发给对应的数据源节点。可选地,所述处理单元还用于:在对所述sql数据查询脚本进行语法解析之前,确定所述sql数据查询脚本可执行。可选地,所述处理单元702具体用于:通过设定的sql数据查询脚本校验规则,对所述sql数据查询脚本的语法和/或参数进行校验,从而确定所述sql数据查询脚本是否可执行。基于相同的技术构思,本发明实施例还提供了一种计算设备,如图8所示,包括至少一个处理器801,以及与至少一个处理器连接的存储器802,本发明实施例中不限定处理器801与存储器802之间的具体连接介质,图8中处理器801和存储器802之间通过总线连接为例。总线可以分为地址总线、数据总线、控制总线等。在本发明实施例中,存储器802存储有可被至少一个处理器801执行的指令,至少一个处理器801通过执行存储器802存储的指令,可以执行前述的数据查询方法中所包括的步骤。其中,处理器801是计算设备的控制中心,可以利用各种接口和线路连接计算设备的各个部分,通过运行或执行存储在存储器802内的指令以及调用存储在存储器802内的数据,从而实现数据处理。可选的,处理器801可包括一个或多个处理单元,处理器801可集成应用处理器和调制解调处理器,其中,应用处理器主要处理操作系统、用户界面和应用程序等,调制解调处理器主要处理下发指令。可以理解的是,上述调制解调处理器也可以不集成到处理器801中。在一些实施例中,处理器801和存储器802可以在同一芯片上实现,在一些实施例中,它们也可以在独立的芯片上分别实现。处理器801可以是通用处理器,例如中央处理器(cpu)、数字信号处理器、专用集成电路(applicationspecificintegratedcircuit,asic)、现场可编程门阵列或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件,可以实现或者执行本发明实施例中公开的各方法、步骤及逻辑框图。通用处理器可以是微处理器或者任何常规的处理器等。结合数据查询方法实施例所公开的方法的步骤可以直接体现为硬件处理器执行完成,或者用处理器中的硬件及软件模块组合执行完成。存储器802作为一种非易失性计算机可读存储介质,可用于存储非易失性软件程序、非易失性计算机可执行程序以及模块。存储器802可以包括至少一种类型的存储介质,例如可以包括闪存、硬盘、多媒体卡、卡型存储器、随机访问存储器(randomaccessmemory,ram)、静态随机访问存储器(staticrandomaccessmemory,sram)、可编程只读存储器(programmablereadonlymemory,prom)、只读存储器(readonlymemory,rom)、带电可擦除可编程只读存储器(electricallyerasableprogrammableread-onlymemory,eeprom)、磁性存储器、磁盘、光盘等等。存储器802是能够用于携带或存储具有指令或数据结构形式的期望的程序代码并能够由计算机存取的任何其他介质,但不限于此。本发明实施例中的存储器802还可以是电路或者其它任意能够实现存储功能的装置,用于存储程序指令和/或数据。基于相同的技术构思,本发明实施例还提供了一种计算机可读存储介质,其存储有可由计算设备执行的计算机程序,当所述程序在所述计算设备上运行时,使得所述计算设备执行上述数据查询方法的步骤。本领域内的技术人员应明白,本发明的实施例可提供为方法、系统、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、cd-rom、光学存储器等)上实施的计算机程序产品的形式。本发明是参照根据本发明的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。尽管已描述了本发明的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例作出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本发明范围的所有变更和修改。显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变型属于本申请权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。当前第1页12当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1