技术领域
[0001] 本发明涉及信息技术领域,并且特别地,涉及一种数据的查询方法和查询装置。
相关背景技术
[0002] 大数据是继云计算、物联网之后信息技术领域的又一次技术变革,大数据有四个典型的特征,即4V特点:Variety(多样性)、Volume(体量)、Velocity(速度)和Value(价值)。由于数据量巨大,以至于通过现有技术很难在合理时间内达到对用户需要的数据进行撷取、管理、或处理,无法满足实时性的要求,以MapReduce(一种编程模型,用于大于1TB的大规模数据集的并行运算)+Hive(Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供完整的结构化查询语言(Structured Query Language,简称SQL),查询功能,可以将SQL语句转换为MapReduce任务进行运行)为例,执行一个查询任务常常需要数分钟甚至数小时,而时间对于决策者是至关重要的,比如在金融市场,几分钟就可能让一个小公司破产,因此,缩短响应时间是大数据领域的迫切需求。
[0003] 当前的大数据处理领域,开源的Hadoop(一种能够对大量数据进行分布式处理的软件框架)生态系统是最常用的技术,其中最常用的是MapReduce+Hive的处理框架,然而Hive的执行速度很慢,因为Hive必须通过MapReduce来访问HDFS(Hadoop Distributed File System,一种分布式文件系统)上的数据,而MapReduce任务的启动是比较耗时的,Cloudera公司根据Google的Dremel论文,开发了一种开源版的大数据处理系统Impala,查询速度比Hive有了一定程度的提高,但是提速效果并不明显,且仍然无法满足实时性的要求。
[0004] 目前,许多大数据处理系统采用了结果保留的技术,就是在一个任务执行完后,将执行结果保存起来,如果下次有相同的任务,可以不用查询,直接将之前保存的执行结果返回,这种方法在一定程度上加快了执行速度,但它是一种被动的方法,不会主动预测用户的行为,对于新任务,提速效果不明显。
[0005] 针对相关技术中,无法预测用户行为、对大数据执行新的查询任务速度慢的问题,目前尚未提出有效的解决方案。
具体实施方式
[0036] 下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员所获得的所有其他实施例,都属于本发明保护的范围。
[0037] 根据本发明的实施例,提供了一种数据的查询方法。
[0038] 如图1所示,该查询方法包括:
[0039] 步骤S101,对预先接收到的至少一个数据查询语句进行整合,得到预查询语句;
[0040] 步骤S103,在预查询时机到达的情况下,执行预查询语句,得到预查询结果;
[0041] 步骤S105,在接收到当前数据查询语句的情况下,执行当前数据查询语句并在预查询结果中进行查询。
[0042] 其中,对预先接收到的数据查询语句进行整合的方式可以是对多个数据查询语句的查询参数进行合并、或者对至少一个数据查询语句的查询参数进行删除、或者对至少一个数据查询语句的查询参数进行扩展、或者以上三种整合方式的任意组合。
[0043] 在一个实施例中,实现本发明技术方案的数据查询系统的整体结构如图2所示,现有的数据查询系统(比如XData系统)只有客户端应用和大数据处理平台两部分,用户通过客户端应用向大数据处理平台提交数据查询任务,大数据处理平台接收到该任务以后开始根据该任务进行数据查询,并将查询结果返回给客户端应用。
[0044] 本实施例是在现有的数据查询系统基础上增加了三个模块:命令收集分析模块、后台任务管理模块、以及预执行结果保存模块。
[0045] 其中,命令收集分析模块用于收集和分析客户端应用提交的任务,客户端应用提交的每一个任务在发给大数据处理平台的同时还会发给命令收集分析模块,命令收集分析模块在收到一条命令以后,会对该命令进行分析,获得该命令的处理对象、操作类型等信息,同时生成一个预处理任务,并把这个预处理任务发给后台任务管理模块,其中,该预处理任务可以包括一条大数据处理平台可以执行的命令(比如SQL命令),以及执行时间,或者在其他实施例中,该预处理任务也可以包括该命令的执行的时间周期,比如每天执行一次,或每周执行一次等。
[0046] 例如,每个SQL语句都包含一个from子句,表示查询的对象,通常情况下,依据from子句,对SQL语句进行分组(当然,在一些特殊情况下,也可以根据其他子句对SQL语句进行分组),也就是说,拥有相同的查询对象的SQL语句全部放在同一个分组中,在同一个分组中,再根据SQL的select子句进行划分,比如把含有统计函数(比如sum,count,avg等)的语句放在同一个子分组中,不包含统计函数的语句放在另一个子分组中。当某个分组的任意一个分组保存的SQL语句达到我们预先设定的值(比如3)以后,就开始对这个分组进行分析,如果该分组不包含统计函数,则提取该分组中所有SQL语句的select字段作为预处理语句的select字段,所有SQL语句的where子句取或作为预处理语句的where子句。比如,一种情况下,有如下三条语句:
[0047] Select a,b from table1where a<10;
[0048] Select b,c from table1where b<10;
[0049] Select a,c,e from table1where c>5;
[0050] 根据这三条语句生成的预处理语句是:
[0051] Select a,b,c,e from table1where a<10or b<10or c>5;
[0052] 此外,在另一种情况下,以上三条语句中的至少一条的where子句中包括多个参数,例如第一条语句为:Select a,b from table1where a<10,a>5;此时,可以将where子句中的参数删除其中任意一个之后,再将该三个语句进行合并,得到预处理语句,比如:
[0053] 经过删除第一条语句中的a<10的参数,得到处理后的语句为
[0054] Select a,b from table1where a>5;
[0055] Select b,c from table1where b<10;
[0056] Select a,c,e from table1where c>5;
[0057] 根据这三条语句生成的预处理语句是:
[0058] Select a,b,c,e from table1where a>5or b<10or c>5;或者,[0059] 将第一条语句中的a>5的参数,得到处理后的语句为
[0060] Select a,b from table1where a<10;
[0061] Select b,c from table1where b<10;
[0062] Select a,c,e from table1where c>5;
[0063] 根据这三条语句生成的预处理语句是:
[0064] Select a,b,c,e from table1where a<10or b<10or c>5;
[0065] 此时,执行以上任意一条预处理语句或者同时执行以上两条预处理语句所得到的预处理结果,不仅包含了原始三个语句的执行结果,还扩大了预处理结果所包含的数据范围,同样,对于在其他语句包括多个参数的情况,均可以采用相类似的处理方式。
[0066] 此外,如果有某一条完全一样的语句重复出现了多次,那么可以单独为其生成一条预处理语句,不用和其他语句合并。
[0067] 此外,执行预查询语句之前,确定预先接收到的至少一个数据查询语句中每个数据查询语句被接收到的时机,得到数据查询语句被接收到的时机的分布规律;
[0068] 根据分布规律确定得到的预查询语句的预查询时机。
[0069] 在一个实施例中,得到预查询语句以后,还要确定其预查询时间。例如,可以根据一个分组中所有语句的平均出现间隔确定预查询时间,假设该分组中3条语句分别在一个月的1号、4号、7号出现,那么,可以把预查询时间的周期设置为3天,执行日期设置为从9号开始,也就是说,预计与该分组中的语句相似的语句会在10号再次出现,所以在9号执行该预查询语句,得到预查询结果,9号即为我们所确定的该预查询语句的预查询时间,并且,如果后来接收到的与该分组中的语句具有相同或者相符的语句的时间规律没有发生变化,则可以继续根据该时间周期执行该预查询语句,如果该时间规律发生变化,则根据新的时间规律重新确定预查询时间、或者时间周期。
[0070] 此外,在生成了预查询语句和预查询时间以后,命令收集分析模块会把该预查询语句发送给后台任务管理模块,后台任务管理模块在收到预查询语句后,会把该语句添加到任务列表中,同时,会定期轮询整个列表,根据预查询时间和大数据处理平台当前的繁忙程度提交任务,并且,执行完一条预查询语句后,结果会保存在预执行结果保存模块中,并且,任务提交会发生在大数据处理平台相对比较空闲的时候,不会影响正常任务的响应时间。
[0071] 当用户向处理平台提交一个任务后,处理平台会先查看预执行结果保存模块中保存的预执行结果,如果有相关结果,就直接返回;在有些情况下,如果在预执行结果中,不包括该任务对应的全部结果,则按照传统的查询方法进行查询,而在有些情况下,如果有部分结果,则把部分结果取回来,再进行剩余的查询,例如:如果接收到的查询语句对应的查询任务是查询9月7号到9月12号之间被访问过的视频数据,而经预执行结果保存模块中仅保存有9月7号到9月10号之间被访问过的视频数据,此时,会通过生成一条新的查询语句,用于查询9月11号到9月12号之间被访问过的视频数据,通过这种方式,在很多容易获知剩余查询任务的情况下,能够大大缩短数据查询时间。
[0072] 并且,进行整合的数据查询语句满足以下条件:预先接收到的多个数据查询语句达到预定数量、且该多个数据查询语句的查询参数彼此相符。
[0073] 例如,命令收集分析模块在收到一条命令以后,首先会把这条命令保存起来,在同类型的命令达到一定数量之后,才开始对命令进行分析。
[0074] 并且,多个数据查询语句的查询参数彼此相符是指:多个数据查询语句具有相同的数据查询区域、和/或要查询的数据类型。
[0075] 例如,在一个实施例中,接收到的三个语句为:
[0076] Select a,b from table1where a<10;
[0077] Select b,c from table1where b<10;
[0078] Select a,c,e from table1where c>5;
[0079] 则该三个语句具有相同的数据查询区域table1,以及满足某些特定条件的具有相同类型的数据a、b、c、e,则将这三个语句分为一组,而由该组语句得到的预查询语句可以是:Select a,b,c,e from table1where a<10or b<10or c>5;
[0080] 同样,在另一个实施例中,接收到的三个语句为:
[0081] Select videoA from table2;
[0082] Select videoB from table2;
[0083] Select videoC from table2;
[0084] 此时,这三个语句同样具有相同的数据查询区域table2,以及具有相同类型的数据videoA、videoB、videoC,则将这三个语句分为一组,而由该组语句得到的预查询语句可以是:Select videoA,videoB,videoC from table2;
[0085] 容易理解,对于接收到的语句进行的不同分组规则,所得到的分组结果也不相同,进而,所得到的预查询语句也可能不同,也就是说,在使用本方法对查询数据的过程中,用户可以根据自身需求,确定对查询语句的分组规则,不限于一种规则,具有很高的灵活性。
[0086] 此外,执行当前数据查询语句并在预查询结果中进行查询之前,判断当前数据查询语句的数据查询范围是否超出预查询语句的数据查询范围;
[0087] 在判断结果为否的情况下,执行数据查询语句并在预查询结果中进行查询。
[0088] 例如,如果得到的预查询语句可能不能完全对应某条SQL语句,比如字段不同或过滤条件不同等,这样,该条SQL语句不能直接得到返回结果,但是,只要该SQL语句的查询范围没有超出预处理语句的查询范围,就可以在预处理结果中集中查询,大大提高响应速度,因为原始数据量已经减少了很多,而对两条或者多条查询语句的查询范围,是相对容易实现的。
[0089] 此外,在当前数据查询语句的数据查询范围超出预查询语句的数据查询范围的情况下,按照传统的查询方法执行当前数据查询语句,并返回查询结果,同时,根据当前数据查询语句对预查询语句进行更新。
[0090] 并且,更新了预查询语句之后,在下一预查询时机到达时,执行更新后的预查询语句得到查询结果,并用该查询结果更新预查询结果。
[0091] 其中,下一预查询时机的确定方法与上述预查询时机的确定方法相类似,根据查询语句的接收时间的规律得到。
[0092] 例如,当前预查询语句为:Select a,b,c,e from table1where a<10or b<10or c>5;而接收到的查询语句为Select a,b from table1where a<10or b<10orc>3;此时,该查询语句所对应的查询数据查询范围已经超出当前的预查询语句的数据查询范围,则在应该传统的查询方法得到查询结果的同时,将当前的预查询语句更新为Select a,b,c,e from table1where a<10or b<10orc>3;并根据与该更新后的预查询语句对应的预查询时间执行该更新后的预查询语句,并用该执行结果更新当前的预执行结果。
[0093] 此外,预执行结果保存模块还可以保存每个结果的访问命中次数或者访问时间信息,并以预定周期把这些信息反馈给后台任务管理模块,后台任务管理模块会根据反馈信息调整提交任务的时间,可以大大提高执行效率,并且,后台任务管理模块也可以根据接收到的反馈信息调整预执行语句的执行时间,对预执行结果进行实时更新。
[0094] 此外,还对预查询结果、和/或预查询语句设置生存时间。
[0095] 例如,在一个实施例中,命令收集分析模块保存用户的查询语句,后台任务管理模块保存预查询语句,预查询结果也保存在相应的模块中,可以设置保存时间,比如只保存一个月以内的信息,如果在一个月时间内,某些预查询语句或者预查询结果没有被访问,则将其自动删除,避免过度占用存储空间。
[0096] 此外,在另一个实施例中,可以将预查询结果的生存时间定义为一预查询时机结束之后的某个时间长度,比如说,确定某个预查询语句的预查询时机为每天晚上7点,而用于生成该预查询语句的查询语句被接收到的时间都分布于每天晚上的8点到10点之间,那么,在每天晚上的11点将该预查询语句的预查询结果删除,并在下一预查询时机到达时,重新执行该预查询语句,重新生成预查询结果,通过此种方案,不仅能够尽量避免过度占用存储空间,还能很大程度上保证预查询结果的实时性,例如,在下一预查询时机到达之前,可能整个数据库的数据已经发生变化,所以,即使是同一预查询语句所对应的预查询结果也可能会发生变化。
[0097] 根据本发明的实施例,还提供了一种数据的查询装置。
[0098] 如图3所示,该查询装置包括:
[0099] 获得模块31,用于对预先接收到的至少一个数据查询语句进行整合,得到预查询语句;
[0100] 执行模块32,用于在预查询时机到达的情况下,执行预查询语句,得到预查询结果;
[0101] 查询模块33,用于在接收到当前数据查询语句的情况下,执行数据查询语句并在预查询结果中进行查询。
[0102] 通过以上描述不难看出,应用本发明的技术方案提供了数据查询方法和查询装置,并借鉴HPC(高性能计算)领域中数据访问模式的概念,能够预测用户需求,提前进行数据查询,可以节省大量查询时间。其中,数据访问模式是指一个应用对于数据的读写特点,比如,某个应用可能从某个位置开始读取文件,每次读取64k,然后跳过之后的64k再读后面的64k,如此重复,在获得这些信息后,可以重新组织文件,把应用需要的内容提取到一个连续的文件中,使磁盘读写变成连续访问,提高读写速度。相应的,本发明在分析应用特点的基础上,提前进行一些数据查询,并把结果保存,用来提高大数据分析查询的速度。
[0103] 此外,本发明可以在基本不引入额外时间开销的情况下提高大数据处理平台的访问速度,并且,本方法不针对特定的平台,具有通用性,且通过在现有的数据查询系统中增加相应模块的接口,即可将新增的功能模块添加进来,实现难度不大,易于部署和修改。在充分了解了应用的特点以后,可以根据该应用的特点设置预处理语句,得到预处理结果,可以极大的提高大数据处理的速度,在一些情况下可以实现秒级实时响应,对于重复性的复杂的数据挖掘和批量处理,更能发挥该方法的优势。
[0104] 在大数据领域,目前查询速度是一个非常难以解决的问题,所以相对于所能达到的技术效果,使用本方法所带来的开销基本可以忽略。
[0105] 本方法自动分析应用于大数据处理平台的交互,得到应用的特点。如果用户的应用较为单一,且用户对自己的应用特点非常了解的话,可以由用户直接指明应用的特点,不使用本方法的收集和分析工具,也能达到同样或更好的提速效果。
[0106] 综上所述,借助于本发明的上述技术方案,通过整合预先接收到的数据查询语句,得到预查询语句,并在预查询时机到达的情况下,执行该预查询语句,得到预查询结果,接收到新的类似的查询语句时,优先从预查询结果中进行查询,能够对用户行为进行预测,很大程度上提高数据查询的速度。
[0107] 以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。