用于查询数据的方法和装置与流程

文档序号:23800157发布日期:2021-02-02 12:33阅读:63来源:国知局
[0001]本公开的实施例涉及计算机
技术领域
:,具体涉及用于查询数据的方法和装置。
背景技术
::[0002]当前,随着大数据技术的蓬勃发展,各大公司的数据量不断积累,eb(艾字节,exabyte)级的数据存储已经非常普遍,在如此大规模的数据存储中,如何快速高效的查询出目标结果,越来越受到关注。通常情况下,数据分析人员希望查询速度越快越好,并且,希望能够自由定义查询维度和指标,灵活编辑查询语句。[0003]现有技术中,一些查询功能基于hive(一个数据仓库工具)引擎来实现,可以将数据存储在hdfs(分布式文件系统,hadoopdistributedfilesystem)中,通过编写hivesql(结构化查询语言,structuredquerylanguage)实现数据查询功能。其中,hive可以将结构化的数据文件映射为一张数据表,并提供简单的sql查询功能,可以将sql语句转换为mapreduce(面向大数据并行处理的计算模型、框架和平台)任务执行。技术实现要素:[0004]本公开提出了用于查询数据的方法和装置。[0005]第一方面,本公开的实施例提供了一种用于查询数据的方法,该方法包括:获取目标语句,其中,目标语句用于操作数据表中的数据,目标语句包含至少一个数据表的表名;对目标语句进行解析,得到目标语句包含的至少一个表名;从预先确定的查询引擎集合中,确定与至少一个表名相关联的查询引擎,作为目标查询引擎;响应于目标语句为查询语句,采用目标查询引擎查询目标语句对应的数据表中的数据。[0006]在一些实施例中,目标语句包含至少两个数据表的表名;以及,对目标语句进行解析,得到目标语句包含的至少一个表名,包括:对目标语句进行解析,得到目标语句包含的至少两个表名;以及,从预先确定的查询引擎集合中,确定与至少一个表名相关联的查询引擎,作为目标查询引擎,包括:从预先确定的查询引擎集合中,分别确定与至少两个表名中的每个表名相关联的查询引擎;响应于所确定出的各个查询引擎指示相同的查询引擎,将各个查询引擎指示的相同的查询引擎作为目标查询引擎。[0007]在一些实施例中,在响应于目标语句为查询语句,采用目标查询引擎查询目标语句对应的数据表中的数据之前,该方法包括:响应于所确定出的各个查询引擎中存在至少两个不同的查询引擎,针对至少两个表名中的每个表名,基于该表名执行如下目标查询引擎确定步骤:响应于该表名指示的数据表中的数据被访问的频次大于或等于预设阈值,并且,响应于接收到用于指示在预先确定的高速引擎中创建该表名指示的数据表的创建信息,在高速引擎中创建该表名指示的数据表,以及将数据表创建后的高速引擎作为目标查询引擎。[0008]在一些实施例中,目标查询引擎确定步骤还包括:响应于该表名指示的数据表中的数据被访问的频次大于或等于预设阈值,并且,响应于接收到用于指示不在预先确定的高速引擎中创建该表名指示的数据表的创建信息,将查询引擎集合中的第一查询引擎作为目标查询引擎。[0009]在一些实施例中,目标语句获取自用户端;以及,在高速引擎中创建该表名指示的数据表,包括:向用户端发送该表名指示的数据表中的各个字段;获取用户端返回的、用户从各个字段中选取的字段;基于所选取的字段,在高速引擎中创建该表名指示的数据表,其中,所创建的该表名指示的数据表中的字段为用户从各个字段中选取的字段。[0010]在一些实施例中,该方法还包括:响应于采用第一查询引擎未查询到目标语句对应的数据表中的数据,采用第二查询引擎查询目标语句对应的数据表中的数据,其中,第二查询引擎为查询引擎集合中的不同于第一查询引擎的查询引擎。[0011]在一些实施例中,对目标语句进行解析,得到目标语句包含的至少一个表名,包括:采用预先确定的正则表达式对目标语句进行匹配,得到目标语句包含的至少一个表名。[0012]在一些实施例中,对目标语句进行解析,得到目标语句包含的至少一个表名,包括:响应于目标语句包含第一预设关键字,按照针对第一预设关键字建立的解析规则,将目标语句解析为结构化查询语言;从结构化查询语言中提取至少一个表名。[0013]在一些实施例中,该方法还包括:响应于目标语句包含第二预设关键字,采用与第二预设关键字相对应的自定义函数对数据表中的数据进行处理,以对数据表中的数据进行第二预设关键字指示的自定义操作。[0014]第二方面,本公开的实施例提供了一种用于查询数据的装置,该装置包括:获取单元,被配置成获取目标语句,其中,目标语句用于操作数据表中的数据,目标语句包含至少一个数据表的表名;解析单元,被配置成对目标语句进行解析,得到目标语句包含的至少一个表名;第一确定单元,被配置成从预先确定的查询引擎集合中,确定与至少一个表名相关联的查询引擎,作为目标查询引擎;第一查询单元,被配置成响应于目标语句为查询语句,采用目标查询引擎查询目标语句对应的数据表中的数据。[0015]在一些实施例中,目标语句包含至少两个数据表的表名;以及,解析单元,进一步被配置成:对目标语句进行解析,得到目标语句包含的至少两个表名;以及,第一确定单元,进一步被配置成:从预先确定的查询引擎集合中,分别确定与至少两个表名中的每个表名相关联的查询引擎;响应于所确定出的各个查询引擎指示相同的查询引擎,将各个查询引擎指示的相同的查询引擎作为目标查询引擎。[0016]在一些实施例中,该装置包括:第二确定单元,被配置成响应于所确定出的各个查询引擎中存在至少两个不同的查询引擎,针对至少两个表名中的每个表名,基于该表名执行如下目标查询引擎确定步骤:响应于该表名指示的数据表中的数据被访问的频次大于或等于预设阈值,并且,响应于接收到用于指示在预先确定的高速引擎中创建该表名指示的数据表的创建信息,在高速引擎中创建该表名指示的数据表,以及将数据表创建后的高速引擎作为目标查询引擎。[0017]在一些实施例中,目标查询引擎确定步骤还包括:响应于该表名指示的数据表中的数据被访问的频次大于或等于预设阈值,并且,响应于接收到用于指示不在预先确定的高速引擎中创建该表名指示的数据表的创建信息,将查询引擎集合中的第一查询引擎作为目标查询引擎。[0018]在一些实施例中,目标语句获取自用户端;以及,第二确定单元,进一步被配置成:向用户端发送该表名指示的数据表中的各个字段;获取用户端返回的、用户从各个字段中选取的字段;基于所选取的字段,在高速引擎中创建该表名指示的数据表,其中,所创建的该表名指示的数据表中的字段为用户从各个字段中选取的字段。[0019]在一些实施例中,该装置还包括:第二查询单元,被配置成响应于采用第一查询引擎未查询到目标语句对应的数据表中的数据,采用第二查询引擎查询目标语句对应的数据表中的数据,其中,第二查询引擎为查询引擎集合中的不同于第一查询引擎的查询引擎。[0020]在一些实施例中,解析单元,进一步被配置成:采用预先确定的正则表达式对目标语句进行匹配,得到目标语句包含的至少一个表名。[0021]在一些实施例中,解析单元,进一步被配置成:响应于目标语句包含第一预设关键字,按照针对第一预设关键字建立的解析规则,将目标语句解析为结构化查询语言;从结构化查询语言中提取至少一个表名。[0022]在一些实施例中,该装置还包括:处理单元,被配置成响应于目标语句包含第二预设关键字,采用与第二预设关键字相对应的自定义函数对数据表中的数据进行处理,以对数据表中的数据进行第二预设关键字指示的自定义操作。[0023]第三方面,本公开的实施例提供了一种用于查询数据的电子设备,包括:一个或多个处理器;存储装置,其上存储有一个或多个程序,当上述一个或多个程序被上述一个或多个处理器执行,使得该一个或多个处理器实现如上述用于查询数据的方法中任一实施例的方法。[0024]第四方面,本公开的实施例提供了一种用于查询数据的计算机可读介质,其上存储有计算机程序,该程序被处理器执行时实现如上述用于查询数据的方法中任一实施例的方法。[0025]本公开的实施例提供的用于查询数据的方法和装置,通过获取目标语句,其中,目标语句用于操作数据表中的数据,目标语句包含至少一个数据表的表名,然后,对目标语句进行解析,得到目标语句包含的至少一个表名,之后,从预先确定的查询引擎集合中,确定与至少一个表名相关联的查询引擎,作为目标查询引擎,最后,在目标语句为查询语句的情况下,采用目标查询引擎查询目标语句对应的数据表中的数据,由此,本公开的实施例可以从查询引擎集合中,确定用于操作目标语句对应的数据表中的数据的查询引擎,进而可以用不同的查询引擎来操作不同的目标语句对应的数据表中的数据,基于各个查询引擎的特点进行数据操作,丰富了数据的查询方式,有助于提高数据的查询速度。附图说明[0026]通过阅读参照以下附图所作的对非限制性实施例所作的详细描述,本公开的其它特征、目的和优点将会变得更明显:[0027]图1是本公开的一些实施例可以应用于其中的示例性系统架构图;[0028]图2是根据本公开的用于查询数据的方法的一个实施例的流程图;[0029]图3a是根据本公开的用于查询数据的方法的一个示意性架构图;[0030]图3b是根据本公开的用于查询数据的方法的一个应用场景的示意图;[0031]图4是根据本公开的用于查询数据的方法的又一个实施例的流程图;[0032]图5是根据本公开的用于查询数据的方法的又一个应用场景的示意图;[0033]图6是根据本公开的用于查询数据的装置的一个实施例的结构示意图;[0034]图7是适于用来实现本公开的一些实施例的电子设备的计算机系统的结构示意图。具体实施方式[0035]下面结合附图和实施例对本公开作进一步的详细说明。可以理解的是,此处所描述的具体实施例仅仅用于解释相关发明,而非对该发明的限定。另外还需要说明的是,为了便于描述,附图中仅示出了与有关发明相关的部分。[0036]需要说明的是,在不冲突的情况下,本公开中的实施例及实施例中的特征可以相互组合。下面将参考附图并结合实施例来详细说明本公开。[0037]图1示出了可以应用本公开的实施例的用于查询数据的方法或用于查询数据的装置的实施例的示例性系统架构100。[0038]如图1所示,系统架构100可以包括终端设备101、102、103,网络104和服务器105。网络104用以在终端设备101、102、103和服务器105之间提供通信链路的介质。网络104可以包括各种连接类型,例如有线、无线通信链路或者光纤电缆等等。[0039]用户可以使用终端设备101、102、103通过网络104与服务器105交互,以接收或发送数据(例如目标语句)等。终端设备101、102、103上可以安装有各种客户端应用,例如视频播放软件、新闻资讯类应用、图像处理类应用、网页浏览器应用、购物类应用、搜索类应用、即时通信工具、邮箱客户端、社交平台软件等。[0040]终端设备101、102、103可以是硬件,也可以是软件。当终端设备101、102、103为硬件时,可以是具有数据查询功能的各种电子设备,包括但不限于智能手机、平板电脑、膝上型便携计算机和台式计算机等等。当终端设备101、102、103为软件时,可以安装在上述所列举的电子设备中。其可以实现成多个软件或软件模块(例如用来提供分布式服务的软件或软件模块),也可以实现成单个软件或软件模块。在此不做具体限定。[0041]服务器105可以是提供各种服务的服务器,例如对终端设备101、102、103待操作(例如查询)的数据进行相应操作的后台服务器。后台服务器可以对接收到的目标语句(例如查询语句)等数据进行分析等处理,从而获得目标语句待操作的数据表中的数据(例如目标语句待查询的数据表中的数据)。可选的,在目标语句为查询语句的情况下,后台服务器还可以将所查询到的数据表中的数据发送至终端设备。作为示例,服务器105可以是云端服务器。[0042]需要说明的是,服务器可以是硬件,也可以是软件。当服务器为硬件时,可以实现成多个服务器组成的分布式服务器集群,也可以实现成单个服务器。当服务器为软件时,可以实现成多个软件或软件模块(例如用来提供分布式服务的软件或软件模块),也可以实现成单个软件或软件模块。在此不做具体限定。[0043]还需要说明的是,本公开的实施例所提供的用于查询数据的方法可以由服务器执行,也可以由终端设备执行,还可以由服务器和终端设备彼此配合执行。相应地,用于查询数据的装置包括的各个部分(例如各个单元)可以全部设置于服务器中,也可以全部设置于终端设备中,还可以分别设置于服务器和终端设备中。[0044]应该理解,图1中的终端设备、网络和服务器的数目仅仅是示意性的。根据实现需要,可以具有任意数目的终端设备、网络和服务器。当用于查询数据的方法运行于其上的电子设备在执行该方法的过程中,不需要与其他电子设备进行数据传输时,该系统架构可以仅包括用于查询数据的方法运行于其上的电子设备(例如服务器)。[0045]继续参考图2,示出了根据本公开的用于查询数据的方法的一个实施例的流程200。该用于查询数据的方法,包括以下步骤:[0046]步骤201,获取目标语句。[0047]在本实施例中,用于查询数据的方法的执行主体(例如图1所示的服务器)可以通过有线连接方式或者无线连接方式从其他电子设备(例如图1所示的终端设备)或者本地获取目标语句。[0048]其中,目标语句用于操作数据表中的数据,目标语句包含至少一个数据表的表名。作为示例,目标语句可以是用于对数据表中的数据进行以下至少一项操作的语句:增加、删除、修改、查找。[0049]在这里,上述目标语句可以是符合sql语法的语句,也可以是符合预先确定的其他语法规则的语句,本公开的实施例在此不作限定。[0050]步骤202,对目标语句进行解析,得到目标语句包含的至少一个表名。[0051]在本实施例中,上述执行主体可以对步骤201获取到的目标语句进行解析,得到目标语句包含的至少一个表名。[0052]应该理解,通常情况下,上述执行主体可以解析得到目标语句中所包含的所有的表名,然而,当目标语句中包含相同的表名时,上述执行主体也可以解析得到目标语句中包含的彼此不同的表名。[0053]在这里,当目标语句中包含union操作符时,上述执行主体可以首先按照union操作符对目标语句进行拆分,以便后续解析。[0054]在本实施例的一些可选的实现方式中,上述执行主体可以采用如下方式,来执行该步骤202:采用预先确定的正则表达式对目标语句进行匹配,得到目标语句包含的至少一个表名。其中,正则表达式(regularexpression),又称规则表达式,通常被用来检索、替换符合预定规则的文本。许多程序设计语言都支持利用正则表达式进行字符串操作。[0055]可以理解,采用正则表达式可以提高得到表名的速度和准确度。[0056]在本实施例的一些可选的实现方式中,上述执行主体也可以采用如下方式,来执行该步骤202:[0057]首先,响应于目标语句包含第一预设关键字,按照针对第一预设关键字建立的解析规则,将目标语句解析为结构化查询语言。[0058]在这里,上述第一预设关键字可以是预先确定的、与sql关键字不同的关键字。作为示例,该第一预设关键字可以是“foreach”、“set”、“function”等等。其中,针对每个第一预设关键字建立的解析规则可以采用程序语句实现。[0059]作为示例,第一预设关键字“foreach”对应的解析规则可以是“如果目标语句包含foreach,则将该目标语句等价变换为foreach对应的代码”。例如,对于包含foreach的目标语句“#foreach(768,838,12301)select*fromapp.demo_tablewhereid=${each}”,可以将其等价变换为如下代码:select*fromapp.demo_tablewhereid=768;select*fromapp.demo_tablewhereid=838;select*fromapp.demo_tablewhereid=12301。distributedfilesystem)构建的数据仓库中,来自不同业务系统的数据经过etl(extract-transform-load,抽取、清洗、转换、装载)处理后被划分为多张不同业务领域的hive数据表。这些数据表可以仅用于对数据的底层存储,并不对外提供查询服务。[0072]上述数据表中的数据可以通过不同的调度方式与各个高级查询引擎(即上述查询引擎集合中的各个查询引擎)进行对接。其中,spark查询引擎是提供查询服务的最底层存储引擎,同时,它还负责将数据调度到其他查询引擎中;kylin查询引擎和phoenix查询引擎是基于hbase(一个分布式的、面向列的开源数据库)构建的,面向列式存储;elasticsearch查询引擎是基于lucene(全文搜索引擎)构建的,面向文档存储;presto查询引擎和hive引擎类似,也是基于hdfs的,但它的计算操作在内存中进行,速度是hive引擎的10倍以上。特别说明的是,presto查询引擎依赖于orc格式的底层压缩进行数据存储,需要借助压缩格式转换器将hive数据表的格式转化为orc格式,这样才能保证presto查询引擎的稳定运行。[0073]其中,由于hive引擎的查询速度较慢,在这里,hive引擎并不直接对外提供服务,而是由spark查询引擎统一提供支持。通常情况下,spark查询引擎可以实现分钟级的响应速度,相比于hive引擎大约能提升一半的查询性能。此外,spark查询引擎还负责向其他查询引擎同步数据,定期做增量更新。同时,还可以记录其他查询引擎上数据表的描述信息,包括表名、字段名、字段类型、注释等,将这些信息进行持久化存储,为引擎路由服务(用于通过程序来确定用于访问数据表中的数据的查询引擎)提供支持。[0074]上述presto查询引擎作为spark查询引擎的补充,能够提供更快的查询性能。对于业务定制化的数据表,将数据压缩格式设置为orc格式后,即可使用presto查询引擎来查询数据表中的数据。[0075]对于秒级查询的场景,可以使用phoenix查询引擎,依托于hbase强大的存储能力和读写效率,根据业务需求构建合适的索引,并通过spark查询引擎推送数据。表信息(例如表名、字段名、字段类型、注释)也可以进行持久化存储,从而为引擎路由服务提供支持。[0076]对于指标和维度不会频繁变动的业务场景,可以使用kylin查询引擎,从而可以实现亚秒级的查询速度。在kylin查询引擎中配置cube,并由spark查询引擎通过应用程序编程接口的方式触发build操作。由于字段过多会导致kylin查询引擎的查询效率降低,可以通过一个控制器来周期性触发sql语句中的merge操作(用来合并sql语句中的更新和插入语句,可以根据一张表或子查询的连接条件对另外一张表进行查询,连接条件匹配上的进行更新操作,无法匹配的执行插入操作)。表信息(例如表名、字段名、字段类型、注释)也可以进行持久化存储,从而为引擎路由服务提供支持。[0077]对于需要进行全文检索的场景,可以使用elasticsearch查询引擎。spark查询引擎可以将数据提取出来得到矩阵数据表(dataframe),然后通过函数将其变成javardd(javaresilientdistributeddatasets,弹性分布式数据集),再调用bulkapi(用于实现批量操作)将数据批量写入。由于elasticsearch查询引擎的查询语言不是sql,因此在elasticsearch查询引擎之上需要部署一套插件(例如elasticsearch-sql插件),从而为jdbc(javadatabaseconnectivity,java数据库连接)驱动提供支持。[0078]以上列出的是查询引擎集合中的5种查询引擎(即kylin查询引擎、phoenix查询引擎、elasticsearch查询引擎、presto查询引擎、spark查询引擎)各自拥有自己的应用场景,因此,可以采用一个引擎路由服务来决定何时使用何种引擎进行查询。表名和与查询引擎可以关联存储于引擎配置库中。当sql语句(例如目标语句)发送过来时,通过正则匹配的方式获取语句中所有的表名,然后,从上述查询引擎集合中,确定与获取到的表名相关联的查询引擎,作为目标查询引擎。[0079]下面返回图2。[0080]步骤204,响应于目标语句为查询语句,采用目标查询引擎查询目标语句对应的数据表中的数据。[0081]在本实施例中,在步骤201获取到的目标语句为查询语句的情况下,上述执行主体还可以采用步骤203所确定出的目标查询引擎查询目标语句对应的数据表中的数据。其中,查询语句可以是用于查询数据表中的数据的语句。该查询语句可以是符合sql语法的语句,也可以是符合预先确定的其他语法规则的语句。目标语句对应的数据表可以是目标语句包含的表名指示的数据表。[0082]继续参见图3b,图3b是根据本实施例的用于查询数据的方法的应用场景的一个示意图。在图3b的应用场景中,服务器301首先获取目标语句3011。其中,如图所示,目标语句3011用于查询表名为emp的数据表中的字段为comm的非空数据。目标语句3011包含的数据表的表名“emp”。然后,服务器301对目标语句3011进行解析,得到目标语句3011包含的表名3012(图示中为emp)。之后,服务器301从预先确定的查询引擎集合3013中,确定与表名“emp”相关联的查询引擎,作为目标查询引擎3014。最后,服务器301采用目标查询引擎3014查询目标语句3011对应的数据表3015中的数据。作为示例,图示中,服务器301采用目标查询引擎3014查询目标语句3011对应的数据表3015(即表名emp指示的数据表)中的数据,从而获得了查询结果3016。[0083]本公开的上述实施例提供的用于查询数据的方法,通过获取目标语句,其中,目标语句用于操作数据表中的数据,目标语句包含至少一个数据表的表名,然后,对目标语句进行解析,得到目标语句包含的至少一个表名,之后,从预先确定的查询引擎集合中,确定与至少一个表名相关联的查询引擎,作为目标查询引擎,最后,在目标语句为查询语句的情况下,采用目标查询引擎查询目标语句对应的数据表中的数据,由此,本公开的实施例可以从查询引擎集合中,确定用于操作目标语句对应的数据表中的数据的查询引擎,进而可以用不同的查询引擎来操作不同的目标语句对应的数据表中的数据,基于各个查询引擎的特点进行数据操作,丰富了数据的查询方式,有助于提高数据的查询速度。[0084]在本实施例的一些可选的实现方式中,目标语句也可以包含至少两个数据表的表名。由此,上述步骤202可以包括:对目标语句进行解析,得到目标语句包含的至少两个表名。基于此,上述执行主体可以采用如下方式来执行上述步骤203:[0085]首先,从预先确定的查询引擎集合中,分别确定与至少两个表名中的每个表名相关联的查询引擎。[0086]然后,在所确定出的各个查询引擎指示相同的查询引擎的情况下,将各个查询引擎指示的相同的查询引擎作为目标查询引擎。[0087]可以理解,本可选的实现方式可以在所确定出的各个查询引擎指示相同的查询引擎的情况下,确定出与至少两个表名中的每个表名相关联的目标查询引擎,从而可以通过目标查询引擎查询至少两个表名中的每个表名指示的数据表中的数据。[0088]在本实施例的一些可选的实现方式中,上述执行主体还可以执行如下步骤:[0089]响应于目标语句包含第二预设关键字,采用与第二预设关键字相对应的自定义函数对数据表中的数据进行处理,以对数据表中的数据进行第二预设关键字指示的自定义操作。[0090]其中,上述第二预设关键字可以是预先确定的字符串。与第二预设关键字相对应的自定义函数可以是技术人员针对第二预设关键字编写的函数(也可以称为方法、算子(例如spark算子))。第二预设关键字与上述第一预设关键字不同。[0091]示例性的,与第二预设关键字“udf”相对应的自定义函数可以用于处理列变换;与第二预设关键字“udaf”相对应的自定义函数可以用于对数据表中的多行数据进行聚合;与第二预设关键字“${yesterday}”相对应的自定义函数可以用于获取昨天日期;与第二预设关键字“${last_month}”相对应的自定义函数可以用于获取上月日期;与第二预设关键字“${n_days_ago}”相对应的自定义函数可以用于获取n天以前的日期,其中,n可以为大于2的整数;与第二预设关键字“${m_months_ago}”相对应的自定义函数可以用于获取m个月以前的日期,其中,m可以为大于2的整数。[0092]应当理解,上述与第二预设关键字对应的自定义函数可以由技术人员自行编写,本可选的实现方式对此不再赘述。[0093]可以理解,本可选的实现方式采用与第二预设关键字相对应的自定义函数对数据表中的数据进行处理,从而可以对现有关键字所能实现的功能进行进一步扩展,从而实现面向sql的高级编程需求,使数据查询更高效、更灵活。[0094]进一步参考图4,其示出了用于查询数据的方法的又一个实施例的流程400。该用于查询数据的方法的流程400,包括以下步骤:[0095]步骤401,获取目标语句。之后,执行步骤402。[0096]在本实施例中,用于查询数据的方法的执行主体(例如图1所示的服务器)可以获取目标语句。其中,目标语句用于操作数据表中的数据,目标语句包含至少两个数据表的表名。[0097]步骤402,对目标语句进行解析,得到目标语句包含的至少两个表名。之后,执行步骤403.[0098]在本实施例中,上述执行主体可以对目标语句进行解析,得到目标语句包含的至少两个表名。[0099]步骤403,从预先确定的查询引擎集合中,分别确定与至少两个表名中的每个表名相关联的查询引擎。之后,执行步骤404。[0100]在本实施例中,上述执行主体可以从预先确定的查询引擎集合中,分别确定与至少两个表名中的每个表名相关联的查询引擎。[0101]步骤404,判断所确定出的各个查询引擎是否指示相同的查询引擎。之后,若是,则执行步骤405;若否,则执行步骤406。[0102]在本实施例中,上述执行主体可以判断所确定出的各个查询引擎是否指示相同的查询引擎。[0103]步骤405,将各个查询引擎指示的相同的查询引擎作为目标查询引擎。之后,执行步骤407。[0104]在本实施例中,在所确定出的各个查询引擎指示相同的查询引擎的情况下,上述执行主体可以将各个查询引擎指示的相同的查询引擎作为目标查询引擎。[0105]步骤406,针对至少两个表名中的每个表名,基于该表名执行如下目标查询引擎确定步骤:响应于该表名指示的数据表中的数据被访问的频次大于或等于预设阈值,并且,响应于接收到用于指示在预先确定的高速引擎中创建该表名指示的数据表的创建信息,在高速引擎中创建该表名指示的数据表,以及将数据表创建后的高速引擎作为目标查询引擎。之后,执行步骤407。[0106]在本实施例中,在所确定出的各个查询引擎并非指示相同的查询引擎(即所确定出的各个查询引擎中存在至少两个不同的查询引擎)的情况下,上述执行主体可以针对至少两个表名中的每个表名,基于该表名执行如下目标查询引擎确定步骤:响应于该表名指示的数据表中的数据被访问的频次大于或等于预设阈值,并且,响应于接收到用于指示在预先确定的高速引擎中创建该表名指示的数据表的创建信息,在高速引擎中创建该表名指示的数据表,以及将数据表创建后的高速引擎作为目标查询引擎。其中,上述高速引擎可以是内存计算引擎。作为示例,高速引擎可以是presto查询引擎,也可以是spark查询引擎。上述创建信息可以是用户端(即用户使用的电子设备)发送的、用于指示是否在高速引擎中创建数据表的信息。[0107]步骤407,响应于目标语句为查询语句,采用目标查询引擎查询目标语句对应的数据表中的数据。[0108]在本实施例中,在目标语句为查询语句的情况下,上述执行主体可以采用目标查询引擎查询目标语句对应的数据表中的数据。[0109]需要说明的是,除上面所记载的内容外,本实施例还可以包括与图2对应的实施例相同或类似的特征、效果,在此不再赘述。[0110]从图4中可以看出,本实施例中的用于查询数据的方法的流程400可以针对不同的应用场景,采用查询引擎集合中的不同查询引擎来实现数据表中数据的操作,从而进一步丰富了数据的查询方式,提高了数据的查询速度。[0111]在本实施例的一些可选的实现方式中,上述可选的实现方式中的目标查询引擎确定步骤还包括:[0112]响应于该表名指示的数据表中的数据被访问的频次大于或等于预设阈值,并且,响应于接收到用于指示不在预先确定的高速引擎中创建该表名指示的数据表的创建信息,将查询引擎集合中的第一查询引擎作为目标查询引擎。其中,第一查询引擎可以是查询引擎集合中的任一查询引擎,也可以是查询引擎集合中的预先确定的查询引擎。作为示例,该第一查询引擎可以是presto查询引擎。[0113]可以理解,本可选的实现方式可以在不在预先确定的高速引擎中创建该表名指示的数据表的情况下,采用第一查询引擎来查询目标语句对应的数据表中的数据,从而可以省略创建该表名指示的数据表的步骤,提高本次访问该数据表中的数据的速度。[0114]在本实施例的一些可选的实现方式中,目标语句获取自用户端。由此,上述执行主体可以采用如下方式,来执行上述可选的实现方式中的“在高速引擎中创建该表名指示的数据表”:[0115]第一步,向用户端发送该表名指示的数据表中的各个字段。[0116]第二步,获取用户端返回的、用户从各个字段中选取的字段。[0117]第三步,基于所选取的字段,在高速引擎中创建该表名指示的数据表。其中,所创建的该表名指示的数据表中的字段为用户从各个字段中选取的字段。[0118]可以理解,在上述执行主体向用户端发送该表名指示的数据表中的所有字段之后,用户端可以呈现所接收到的各个字段,接着,用户可以通过其所使用的用户端从该表名指示的数据表中的所有字段中选取一个或多个字段。在这里,用户可以根据实际需求来进行字段的选取,例如,用户可以选取该数据表中访问频次大于或等于预设频次阈值的字段,也可以首先确定该数据表中各个字段占用的存储空间,从而选取所占用的存储空间小于或等于预设阈值的字段。[0119]可以理解,本可选的实现方式可以根据用户选取的字段,在高速引擎中创建该表名指示的数据表,从而使得所创建的数据表中不包含用户未选择的字段,相对于在高速引擎中采用数据表中的全部字段创建数据表的方案,当高速引擎为内存计算引擎时,本可选的实现方式可以减少所创建的数据表占用的内存空间,提高后续访问所创建的数据表中的数据的速度。[0120]在本实施例的一些可选的实现方式中,上述执行主体还可以执行如下步骤:[0121]响应于采用第一查询引擎未查询到目标语句对应的数据表中的数据,采用第二查询引擎查询目标语句对应的数据表中的数据。其中,第二查询引擎为查询引擎集合中的不同于第一查询引擎的查询引擎。[0122]在这里,上述第二查询引擎可以是查询引擎集合中不同于第一查询引擎的任一查询引擎,也可以是查询引擎集合中不同于第一查询引擎的、预先确定的查询引擎。作为示例,当查询引擎集合由kylin查询引擎、phoenix查询引擎、elasticsearch查询引擎、presto查询引擎、spark查询引擎组成时,第一查询引擎可以是presto查询引擎,第二查询引擎可以是spark查询引擎。[0123]可以理解,由于查询引擎集合中的各个查询引擎可能适合用于查询不同的存储形式的数据,因而,对于某个查询引擎,可能由于目标语句对应的数据表中的数据的存储形式与其所适合查询的数据的存储形式不同,进而导致该查询引擎未查询到目标语句对应的数据表中的数据,在此场景下,可以采用不同于第一查询引擎的第二查询引擎来查询目标语句对应的数据表中的数据,从而获得查询结果,由此丰富了数据的查询方式。[0124]作为示例,请继续参考图5,图5是根据本公开的用于查询数据的方法的又一个应用场景的示意图。该用于查询数据的方法的示例可以通过如下步骤(包括步骤501-步骤514)来实现:[0125]步骤501,从用户端获取目标语句。之后,执行步骤502。[0126]在本示例中,用于查询数据的方法的执行主体(例如图1所示的服务器)可以通过有线连接方式或者无线连接方式从用户端获取目标语句。其中,目标语句用于操作数据表中的数据,目标语句包含至少两个数据表的表名。[0127]步骤502,对目标语句进行解析,得到目标语句包含的至少两个表名。之后,执行步骤503。[0128]在本示例中,上述执行主体可以对目标语句进行解析,得到目标语句包含的至少两个表名。[0129]步骤503,从预先确定的查询引擎集合中,分别确定与至少两个表名中的每个表名相关联的查询引擎。之后,执行步骤504。[0130]在本示例中,上述执行主体可以从预先确定的查询引擎集合中,分别确定与至少两个表名中的每个表名相关联的查询引擎[0131]步骤504,判断所确定出的各个查询引擎是否指示相同的查询引擎。之后,若所确定出的各个查询引擎指示相同的查询引擎,则执行步骤505;若所确定出的各个查询引擎并非指示相同的查询引擎,也即所确定出的各个查询引擎中存在至少两个不同的查询引擎,则执行步骤506。[0132]在本示例中,上述执行主体可以判断所确定出的各个查询引擎是否指示相同的查询引擎。[0133]步骤505,将各个查询引擎指示的相同的查询引擎作为目标查询引擎。之后,执行步骤512。[0134]在本示例中,在所确定出的各个查询引擎指示相同的查询引擎的情况下,上述执行主体可以将各个查询引擎指示的相同的查询引擎作为目标查询引擎。[0135]步骤506,从上述至少两个表名中选取一个表名。之后,执行步骤507。[0136]在本示例中,在所确定出的各个查询引擎并非指示相同的查询引擎(即所确定出的各个查询引擎中存在至少两个不同的查询引擎)的情况下,上述执行主体可以从上述至少两个表名中选取一个表名。[0137]步骤507,判断该表名指示的数据表中的数据被访问的频次是否大于或等于预设阈值。之后,若该表名指示的数据表中的数据被访问的频次大于或等于预设阈值,则执行步骤508。[0138]在本示例中,上述执行主体可以判断该表名指示的数据表中的数据被访问的频次是否大于或等于预设阈值。[0139]步骤508,确定是否接收到用于指示在预先确定的高速引擎中创建该表名指示的数据表的创建信息。之后,若接收到用于指示在预先确定的高速引擎中创建该表名指示的数据表的创建信息,则执行步骤509;若未接收到用于指示在预先确定的高速引擎中创建该表名指示的数据表的创建信息,或者,若接收到用于指示不在预先确定的高速引擎中创建该表名指示的数据表的创建信息,则执行步骤510。[0140]在本示例中,在步骤507判断该表名指示的数据表中的数据被访问的频次大于或等于预设阈值的情况下,上述执行主体可以确定是否接收到用于指示在预先确定的高速引擎中创建该表名指示的数据表的创建信息。[0141]步骤509,向用户端发送该表名指示的数据表中的各个字段,获取用户端返回的、用户从各个字段中选取的字段,基于所选取的字段,在高速引擎中创建该表名指示的数据表,以及将数据表创建后的高速引擎作为目标查询引擎。之后,执行步骤511。[0142]在本示例中,在步骤508确定接收到用于指示在预先确定的高速引擎中创建该表名指示的数据表的创建信息的情况下,上述执行主体可以向用户端发送该表名指示的数据表中的各个字段,获取用户端返回的、用户从各个字段中选取的字段,基于所选取的字段,在高速引擎中创建该表名指示的数据表,以及将数据表创建后的高速引擎作为目标查询引擎。其中,所创建的该表名指示的数据表中的字段为用户从各个字段中选取的字段。[0143]步骤510,将查询引擎集合中的第一查询引擎作为目标查询引擎。之后,执行步骤511。[0144]在本示例中,在步骤508确定未接收到用于指示在预先确定的高速引擎中创建该表名指示的数据表的创建信息,或者,若接收到用于指示不在预先确定的高速引擎中创建该表名指示的数据表的创建信息的情况下,上述执行主体可以将查询引擎集合中的第一查询引擎作为目标查询引擎。[0145]步骤511,判断上述至少两个表名中,是否存在未被选取的表名。之后,若上述至少两个表名中存在未被选取的表名,则执行步骤513;若上述至少两个表名中不存在未被选取的表名,则执行步骤512。[0146]在本示例中,上述执行主体可以判断上述至少两个表名中,是否存在未被选取的表名。[0147]步骤512,响应于目标语句为查询语句,采用目标查询引擎查询目标语句对应的数据表中的数据。之后,执行步骤514。[0148]在本示例中,在步骤511判断上述至少两个表名中存在未被选取的表名,并且,目标语句为查询语句的情况下,上述执行主体可以采用目标查询引擎查询目标语句对应的数据表中的数据。[0149]步骤513,从上述至少两个表名中选取未被选取过的表名。之后,执行步骤507。[0150]在本示例中,在步骤511判断上述至少两个表名中不存在未被选取的表名,并且,上述执行主体可以从上述至少两个表名中选取未被选取过的表名。[0151]步骤514,响应于采用第一查询引擎未查询到目标语句对应的数据表中的数据,采用第二查询引擎查询目标语句对应的数据表中的数据。[0152]在本示例中,在采用第一查询引擎未查询到目标语句对应的数据表中的数据的情况下,上述执行主体可以采用第二查询引擎查询目标语句对应的数据表中的数据。其中,第二查询引擎为查询引擎集合中的不同于第一查询引擎的查询引擎。[0153]从图5中可以看出,本应用场景中的用于查询数据的方法可以针对不同的应用场景,采用查询引擎集合中的不同查询引擎来实现数据表中数据的操作,可以提供分钟级、秒级、甚至亚秒级的查询服务。同时,能够满足更加丰富的语法表达能力,支持简单的控制逻辑,简化时间处理、文本处理、集合处理的逻辑,使用户能够灵活的使用类结构化查询语言语法实现复杂的业务查询任务。[0154]进一步参考图6,作为对上述图2所示方法的实现,本公开提供了一种用于查询数据的装置的一个实施例,该装置实施例与图2所示的方法实施例相对应,除下面所记载的特征外,该装置实施例还可以包括与图2所示的方法实施例相同或相应的特征,以及产生与图2所示的方法实施例相同或相应的效果。该装置具体可以应用于各种电子设备中。[0155]如图6所示,本实施例的用于查询数据的装置600包括:获取单元601被配置成获取目标语句,其中,目标语句用于操作数据表中的数据,目标语句包含至少一个数据表的表名;解析单元602被配置成对目标语句进行解析,得到目标语句包含的至少一个表名;第一确定单元603被配置成从预先确定的查询引擎集合中,确定与至少一个表名相关联的查询引擎,作为目标查询引擎;第一查询单元604被配置成响应于目标语句为查询语句,采用目标查询引擎查询目标语句对应的数据表中的数据。[0156]在本实施例中,用于查询数据的装置600的获取单元601可以通过有线连接方式或者无线连接方式从其他电子设备(例如图1所示的终端设备)或者本地获取目标语句。其中,目标语句用于操作数据表中的数据,目标语句包含至少一个数据表的表名。作为示例,目标语句可以是用于对数据表中的数据进行以下至少一项操作的语句:增加、删除、修改、查找。[0157]在本实施例中,上述解析单元602可以对获取单元601获取到的目标语句进行解析,得到目标语句包含的至少一个表名。其中,上述解析单元602可以解析得到目标语句中所包含的所有的表名,然而,当目标语句中包含相同的表名时,上述装置600也可以解析得到目标语句中包含的彼此不同的表名。[0158]在本实施例中,上述第一确定单元603可以从预先确定的查询引擎集合中,确定与至少一个表名相关联的查询引擎,作为目标查询引擎。其中,上述查询引擎集合中的查询引擎可以是现有的任一查询引擎,例如,kylin查询引擎、phoenix查询引擎、elasticsearch查询引擎、presto查询引擎、spark查询引擎等等;也可以是技术人员搭建的查询引擎。[0159]在本实施例中,在获取单元601获取到的目标语句为查询语句的情况下,上述第一查询单元604还可以采用第一确定单元603所确定出的目标查询引擎查询目标语句对应的数据表中的数据。其中,查询语句可以是用于查询数据表中的数据的语句。该查询语句可以是符合sql语法的语句,也可以是符合预先确定的其他语法规则的语句。[0160]在本实施例的一些可选的实现方式中,目标语句包含至少两个数据表的表名;以及,解析单元602,进一步被配置成:对目标语句进行解析,得到目标语句包含的至少两个表名。以及,第一确定单元603,进一步被配置成:从预先确定的查询引擎集合中,分别确定与至少两个表名中的每个表名相关联的查询引擎;响应于所确定出的各个查询引擎指示相同的查询引擎,将各个查询引擎指示的相同的查询引擎作为目标查询引擎。[0161]在本实施例的一些可选的实现方式中,该装置600包括:第二确定单元(图中未示出),被配置成响应于所确定出的各个查询引擎中存在至少两个不同的查询引擎,针对至少两个表名中的每个表名,基于该表名执行如下目标查询引擎确定步骤:响应于该表名指示的数据表中的数据被访问的频次大于或等于预设阈值,并且,响应于接收到用于指示在预先确定的高速引擎中创建该表名指示的数据表的创建信息,在高速引擎中创建该表名指示的数据表,以及将数据表创建后的高速引擎作为目标查询引擎。[0162]在本实施例的一些可选的实现方式中,目标查询引擎确定步骤还包括:响应于该表名指示的数据表中的数据被访问的频次大于或等于预设阈值,并且,响应于接收到用于指示不在预先确定的高速引擎中创建该表名指示的数据表的创建信息,将查询引擎集合中的第一查询引擎作为目标查询引擎。[0163]在本实施例的一些可选的实现方式中,目标语句获取自用户端;以及,第二确定单元(图中未示出),可以进一步被配置成:向用户端发送该表名指示的数据表中的各个字段;获取用户端返回的、用户从各个字段中选取的字段;基于所选取的字段,在高速引擎中创建该表名指示的数据表,其中,所创建的该表名指示的数据表中的字段为用户从各个字段中选取的字段。[0164]在本实施例的一些可选的实现方式中,该装置600还包括:第二查询单元(图中未示出),被配置成响应于采用第一查询引擎未查询到目标语句对应的数据表中的数据,采用第二查询引擎查询目标语句对应的数据表中的数据,其中,第二查询引擎为查询引擎集合中的不同于第一查询引擎的查询引擎。[0165]在本实施例的一些可选的实现方式中,解析单元602可以进一步被配置成:采用预先确定的正则表达式对目标语句进行匹配,得到目标语句包含的至少一个表名。[0166]在本实施例的一些可选的实现方式中,解析单元602也可以进一步被配置成:响应于目标语句包含第一预设关键字,按照针对第一预设关键字建立的解析规则,将目标语句解析为结构化查询语言;从结构化查询语言中提取至少一个表名。[0167]在本实施例的一些可选的实现方式中,该装置600还包括:处理单元(图中未示出),被配置成响应于目标语句包含第二预设关键字,采用与第二预设关键字相对应的自定义函数对数据表中的数据进行处理,以对数据表中的数据进行第二预设关键字指示的自定义操作。[0168]本公开的上述实施例提供的用于查询数据的装置,通过获取单元601获取目标语句,其中,目标语句用于操作数据表中的数据,目标语句包含至少一个数据表的表名,然后,解析单元602对目标语句进行解析,得到目标语句包含的至少一个表名,之后,第一确定单元603从预先确定的查询引擎集合中,确定与至少一个表名相关联的查询引擎,作为目标查询引擎,最后,响应于目标语句为查询语句,第一查询单元604采用目标查询引擎查询目标语句对应的数据表中的数据,由此,本公开的上述实施例提供的用于查询数据的装置可以从查询引擎集合中,确定用于操作目标语句对应的数据表中的数据的查询引擎,进而可以用不同的查询引擎来操作不同的目标语句对应的数据表中的数据,基于各个查询引擎的特点进行数据操作,丰富了数据的查询方式,有助于提高数据的查询速度。[0169]下面参考图7,其示出了适于用来实现本公开的实施例的电子设备(例如图1中的服务器或终端设备)700的结构示意图。本公开的实施例中的终端设备可以包括但不限于诸如移动电话、笔记本电脑、数字广播接收器、pda(个人数字助理)、pad(平板电脑)、pmp(便携式多媒体播放器)、车载终端(例如车载导航终端)等等的移动终端以及诸如数字tv、台式计算机等等的固定终端。图7示出的终端设备/服务器仅仅是一个示例,不应对本公开的实施例的功能和使用范围带来任何限制。[0170]如图7所示,电子设备700可以包括处理装置(例如中央处理器、图形处理器等)701,其可以根据存储在只读存储器(rom)702中的程序或者从存储装置708加载到随机访问存储器(ram)703中的程序而执行各种适当的动作和处理。在ram703中,还存储有电子设备700操作所需的各种程序和数据。处理装置701、rom702以及ram703通过总线704彼此相连。输入/输出(i/o)接口705也连接至总线704。[0171]通常,以下装置可以连接至i/o接口705:包括例如触摸屏、触摸板、键盘、鼠标、摄像头、麦克风、加速度计、陀螺仪等的输入装置706;包括例如液晶显示器(lcd)、扬声器、振动器等的输出装置707;包括例如磁带、硬盘等的存储装置708;以及通信装置709。通信装置709可以允许电子设备700与其他设备进行无线或有线通信以交换数据。虽然图7示出了具有各种装置的电子设备700,但是应理解的是,并不要求实施或具备所有示出的装置。可以替代地实施或具备更多或更少的装置。图7中示出的每个方框可以代表一个装置,也可以根据需要代表多个装置。[0172]特别地,根据本公开的实施例,上文参考流程图描述的过程可以被实现为计算机软件程序。例如,本公开的实施例包括一种计算机程序产品,其包括承载在计算机可读介质上的计算机程序,该计算机程序包含用于执行流程图所示的方法的程序代码。在这样的实施例中,该计算机程序可以通过通信装置709从网络上被下载和安装,或者从存储装置708被安装,或者从rom702被安装。在该计算机程序被处理装置701执行时,执行本公开的实施例的方法中限定的上述功能。[0173]需要说明的是,本公开的实施例所述的计算机可读介质可以是计算机可读信号介质或者计算机可读存储介质或者是上述两者的任意组合。计算机可读存储介质例如可以是——但不限于——电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。计算机可读存储介质的更具体的例子可以包括但不限于:具有一个或多个导线的电连接、便携式计算机磁盘、硬盘、随机访问存储器(ram)、只读存储器(rom)、可擦式可编程只读存储器(eprom或闪存)、光纤、便携式紧凑磁盘只读存储器(cd-rom)、光存储器件、磁存储器件、或者上述的任意合适的组合。在本公开的实施例中,计算机可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。而在本公开的实施例中,计算机可读信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了计算机可读的程序代码。这种传播的数据信号可以采用多种形式,包括但不限于电磁信号、光信号或上述的任意合适的组合。计算机可读信号介质还可以是计算机可读存储介质以外的任何计算机可读介质,该计算机可读信号介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。计算机可读介质上包含的程序代码可以用任何适当的介质传输,包括但不限于:电线、光缆、rf(射频)等等,或者上述的任意合适的组合。[0174]上述计算机可读介质可以是上述电子设备中所包含的;也可以是单独存在,而未装配入该电子设备中。上述计算机可读介质承载有一个或者多个程序,当上述一个或者多个程序被该电子设备执行时,使得该电子设备:获取目标语句,其中,目标语句用于操作数据表中的数据,目标语句包含至少一个数据表的表名;对目标语句进行解析,得到目标语句包含的至少一个表名;从预先确定的查询引擎集合中,确定与至少一个表名相关联的查询引擎,作为目标查询引擎;响应于目标语句为查询语句,采用目标查询引擎查询目标语句对应的数据表中的数据。[0175]可以以一种或多种程序设计语言或其组合来编写用于执行本公开的实施例的操作的计算机程序代码,所述程序设计语言包括面向对象的程序设计语言—诸如java、smalltalk、c++,还包括常规的过程式程序设计语言—诸如“c”语言或类似的程序设计语言。程序代码可以完全地在用户计算机上执行、部分地在用户计算机上执行、作为一个独立的软件包执行、部分在用户计算机上部分在远程计算机上执行、或者完全在远程计算机或服务器上执行。在涉及远程计算机的情形中,远程计算机可以通过任意种类的网络——包括局域网(lan)或广域网(wan)—连接到用户计算机,或者,可以连接到外部计算机(例如利用因特网服务提供商来通过因特网连接)。[0176]附图中的流程图和框图,图示了按照本公开各种实施例的系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段、或代码的一部分,该模块、程序段、或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个接连地表示的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或操作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。[0177]描述于本公开的实施例中所涉及到的单元可以通过软件的方式实现,也可以通过硬件的方式来实现。所描述的单元也可以设置在处理器中,例如,可以描述为:一种处理器包括获取单元、解析单元、第一确定单元和第一查询单元。其中,这些单元的名称在某种情况下并不构成对该单元本身的限定,例如,获取单元还可以被描述为“获取目标语句的单元”。[0178]以上描述仅为本公开的较佳实施例以及对所运用技术原理的说明。本领域技术人员应当理解,本公开中所涉及的发明范围,并不限于上述技术特征的特定组合而成的技术方案,同时也应涵盖在不脱离上述发明构思的情况下,由上述技术特征或其等同特征进行任意组合而形成的其它技术方案。例如上述特征与本公开中公开的(但不限于)具有类似功能的技术特征进行互相替换而形成的技术方案。当前第1页1 2 3 当前第1页1 2 3 
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1