CN105930453A - 重复性分析方法及装置 - Google Patents
重复性分析方法及装置 Download PDFInfo
- Publication number
- CN105930453A CN105930453A CN201610251980.1A CN201610251980A CN105930453A CN 105930453 A CN105930453 A CN 105930453A CN 201610251980 A CN201610251980 A CN 201610251980A CN 105930453 A CN105930453 A CN 105930453A
- Authority
- CN
- China
- Prior art keywords
- field
- query statement
- syntax tree
- sql query
- value
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/24—Querying
- G06F16/242—Query formulation
- G06F16/2433—Query languages
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F40/00—Handling natural language data
- G06F40/20—Natural language analysis
- G06F40/205—Parsing
- G06F40/211—Syntactic parsing, e.g. based on context-free grammar [CFG] or unification grammars
Abstract
本发明实施例提供一种重复性分析方法及装置。根据预设的关键字对第一SQL查询语句与第二SQL查询语句进行拆分,分别获得与所述第一SQL查询语句相对应的第一集合以及与所述第二SQL查询语句对应的第二集合;对所述第一集合以及所述第二集合中的每一元素的值进行拆分,分别得到所述第一集合对应的第一语法树以及所述第二集合对应的第二语法树;当根据所述第一语法树以及所述第二语法树判定所述第一集合中的元素都包含于所述第二集合,且所述第二集合中的元素都包含于所述第一集合,则判定所述第一SQL查询语句与所述第二SQL查询语句具有重复性。实现了高效的重复性分析,提高了分布式资源的利用率。
Description
技术领域
本发明实施例涉及数据处理技术领域,尤其涉及一种重复性分析方法及装置。
背景技术
Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的SQL(Structured Query Language)查询功能,可以将SQL语句转换为MapReduce任务进行运行。Hive的学习成本低,可以通过类SQL语句快速实现简单的MapReduce统计,不必开发专门的MapReduce应用,十分适合数据仓库的统计分析。
在大数据云计算系统中,每天运行着数万个hive任务,这些任务有一部分是重复的,即功能完全相同的任务。重复的任务会造成大量的资源浪费,所以需要找出哪些任务是重复的。
然而,通过SQL语句单表查询进行任务重复性分析时,简单的方法是判断输成SQL语句的字符串是否相同,然而这种分析方法存在大量弊端,例如:SQL语句中,不在引号内的空格、tab键、换行符是没有意义的,仅仅这些字符不同的两个SQL语句应该认为是相同的。举例如下:检索条件部分“wherecity=’北京’”,where后面加任意个空格是没有意义的。但是city=’北京’和city=’北京’,意思不一样。与此同时,SQL语句的不在引号内的部分的大小写不会引起结果的不同。又例如,在SQL语句中,Fileds字段的顺序可以颠倒。又例如,在SQL语句中,Conditions部分有的顺序可以颠倒,如where c1=’1’and c2=’2’和where c2=’2’and c1=’1’结果是一样的。又例如,在SQL语句中,Group_by_clauses部分,字段的顺序可以颠倒。如group by c1,c2和groupby c2,c1相同。实际上,这些字段内容相同而顺序可以颠倒的语句,其对应的检索结果其实是一样的,然而,由于SQL语句单表查询时存在的上述缺点,导致基于单表查询的重复性分析效率和正确率都存在一定问题。
因此,一种高效精确的重复性分析方法亟待提出。
发明内容
本发明实施例提供一种重复性分析方法及装置,用以解决现有技术中重复任务对资源浪费的缺陷,实现重复任务的高效分析。
本发明实施例提供一种重复性分析方法,包括:
根据预设的关键字对第一SQL查询语句与第二SQL查询语句进行拆分,分别获得与所述第一SQL查询语句相对应的第一集合以及与所述第二SQL查询语句对应的第二集合;
对所述第一集合以及所述第二集合中的每一元素的值进行拆分,分别得到所述第一集合对应的第一语法树以及所述第二集合对应的第二语法树;
当根据所述第一语法树以及所述第二语法树判定所述第一集合中的元素都包含于所述第二集合,且所述第二集合中的元素都包含于所述第一集合,则判定所述第一SQL查询语句与所述第二SQL查询语句具有重复性。
本发明实施例提供一种重复性分析装置,包括:
拆分模块,用于根据预设的关键字对第一SQL查询语句与第二SQL查询语句进行拆分,分别获得与所述第一SQL查询语句相对应的第一集合以及与所述第二SQL查询语句对应的第二集合;
所述拆分模块,还用于对所述第一集合以及所述第二集合中的每一元素的值进行拆分,分别得到所述第一集合对应的第一语法树以及所述第二集合对应的第二语法树;
分析模块,用于当根据所述第一语法树以及所述第二语法树判定所述第一集合中的元素都包含于所述第二集合,且所述第二集合中的元素都包含于所述第一集合,则判定所述第一SQL查询语句与所述第二SQL查询语句具有重复性。
本发明实施例提供的重复性分析方法及装置,通过对SQL查询语句进行拆分并生成语法树,通过判定任意两个SQL查询语句对应的语法树是否一致来进行重复性分析,改变了现有技术中进行重复性分析时,由于SQL查询语句中字段顺序颠倒造成的重复性分析效率低的缺陷,实现了高正确率的重复性分析,提高了分布式资源的利用率。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本申请实施例一的技术流程图;
图2为本申请实施例二的语法树示例图;
图3为本发明实施例三的装置结构示意图;
图4-1为本发明应用实例的语法树1示意图;
图4-2为本发明应用实例的语法树2示意图;
图4-3为本发明应用实例的语法树3示意图;
图4-4为本发明应用实例的语法树4示意图。
具体实施方式
为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
图1是本申请实施例一的技术流程图,结合图1,本申请实施例一种一种重复性分析方法,可以由如下的步骤实现:
步骤S110:根据预设的关键字对第一SQL查询语句与第二SQL查询语句进行拆分,分别获得与所述第一SQL查询语句相对应的第一集合以及与所述第二SQL查询语句对应的第二集合;
步骤S120:对所述第一集合以及所述第二集合中的每一元素的值进行拆分,分别得到所述第一集合对应的第一语法树以及所述第二集合对应的第二语法树;
步骤S130:当根据所述第一语法树以及所述第二语法树判定所述第一集合中的元素都包含于所述第二集合,且所述第二集合中的元素都包含于所述第一集合,则判定所述第一SQL查询语句与所述第二SQL查询语句具有重复性。
本申请实施例中,以SQL语句的单表查询为例对本申请的技术方案进行具体阐述。SQL语句单表查询语句的标准格式为:SELECT fields FROMtableName WHERE conditions GROUP BY group_by_clauses ORDER BYorder_by_clauses。
其中,Fields:是指检索的字段;tableName:指检索的表名;conditions为:检索条件,检索条件可能是多个;group_by_clauses:是分组条件,可能多个;order by clauses:是排序字段,可能多个;tableName以及Fields是SQL语句中必须的部分,其余部分不是必须的。用上述SQL语句单表查询语句对单表中的任务进行查询时,每一部分都会返回相应的查询值。
具体的,在步骤S110中,根据预设的关键字对所述第一SQL查询语句与所述第二SQL查询语句进行拆分,所述预设的关键字即SQL查询语句中标准格式中的Fields、conditions、group_by_clauses、order by clauses等。hive任务表中,在进行重复性查询分析时,将每一条待分析的SQL查询语句拆分成小的部分,并判断每一部分的一致性,从而得到整体一致性的判断。
其中,所述第一集合是所述第一SQL查询语句的拆分结果,其元素至少包括第一检索字段、第一检索表名、第一检索条件、第一分组条件以及第一排序字段中的所述第一检索字段以及所述第一检索表名。
所述第二集合是所述第二SQL查询语句的拆分结果,其元素至少包括第二检索字段、第二检索表名、第二检索条件、第二分组条件以及第二排序字段中的所述第二检索字段以及所述第二检索表名。
具体的,在步骤S120中,分别对所述第一集合以及所述第二集合中的每一个元素的值进行拆分。例如,在第一集合中,对第一检索字段、第一检索表名、第一检索条件、第一分组条件以及第一排序字段的值进行拆分,寻找上述第一集合中的每一元素是否含有子集合。
为方便不同SQL查询语句的直观比较,本申请实施例中为每一SQL查询语句构建语法树,语法树的根节点通常可以是任务名称,语法树的第一层子节点可以是语法树对应集合的元素,语法树更深层的子节点可以是不同元素对应的子节点。构建语法树时,需要对每一元素进行拆分。具体的,在对每一不同元素进行拆分时,按照不同的拆分规则进行拆分。具体拆分规则如下:
当所述第一检索字段的值或所述第二检索字段的值包含有至少两个字段时,根据字段之间的符号连接,对所述至少两个字段进行拆分从而分别得到所述第一检索字段的子节点以及所述第二检索字段的子节点。其中所述符号连接可以是逗号、顿号等字段连接符。例如,第一检索字段中,Fileds=“selectc1,c2”,则根据字段之间的逗号将所述第一检索字段拆分为c1以及c2。
当所述第一检索条件的值中包含带有操作符的检索条件时,按照所述操作符对所述检索条件进行拆分并将所述操作符作为所述第一检索条件的子节点;当所述第二检索条件的值中包含带有操作符的检索条件时,按照所述操作符对所述检索条件进行拆分并将所述操作符作为所述第二检索条件的子节点。其中,所述操作符可以包括“>”、“>=”、“<”、“<=”、“=”、“<>”、“!=”、“like”、“and”、“or”、“not”,“Between AND”,“in”。其中,“=”代表相等。如姓名等于王明,为name=’王明’,在SQL中用单引号把字符串引起来。
“<>”和“!=”代表不相等,如姓名不等于王明,为name!=’王明’或者name<>’王明’。
Like用作字符串部分匹配,有两个特殊符号,‘?’和‘%’。‘?’代表任意一个字符。如name like‘王?’代表第一个字符是‘王’,第二个字符任意。‘%’代表0个或多个字符,如name like‘王%’,则代表以‘王’开头的都符合。
“and”指and操作符两边的条件都必须同时符合。如name=’王明’andage=’18’,指姓名是“王明”并且年龄是18岁。“or”两边的条件有一个符合即可。如name=’王明’or age=’18’,指姓名是“王明”或者年龄是18岁。“betweenand”用于范围判断,如age between 18and 20,指年龄在18和20之间。“in”指在括号的列表内,如name in(‘王明’,’李鹏’,’张飞’),指姓名是“王明”、“李鹏”或者“张飞”。“not”指条件取反,如name not in(‘王明’,’李鹏’,’张飞’),指姓名不是“王明”、“李鹏”或者“张飞”的人。
特别的,当所述操作符中存在逻辑或(or)时,按照逻辑或的数量将所述检索条件拆分为相应数量的所述逻辑或的子节点;当所述操作符中存在逻辑与(and)时,将逻辑与连接的检索条件拆分为同一个子节点。
例如,当第一检索条件Conditions的值只有一个条件:如c1=’1’。那么操作符’or’只有一个子节点,子节点也只有一个部分,即c1=’1’。
当第一检索条件Condisions的值有两个或多个’and’关键字条件连接的条件,如c1=’1’and c2=‘2’。那么’or’部分只有一个子节点,子节点有两个部分,第一部分c1=’1’第二部分c2=’2’。
当第一检索条件Conditions的值有两个或多个’or关键字条件连接的条件,如c1=’1’or c2=‘2’。那么’or’部分有两个子节点:子节点1、子节点2。子节点1有一个部分c1=’1’,子节点2有一个部分c2=’2’。
当第一检索条件Conditions的值既有’or’关键字,也有’and’关键字,先按’or’关键字进行拆分,每一部分再按’and’进行拆分。
若第一检索条件Conditions的值如果有括号,要先去括号进行变换。如果括号内符号都是’and’,(c1=’1’and c2=’2’)or c3=’3’,则可以把括号直接去掉,如果是(c1=’1’or c2=’2’)and c3=’3’,则可以变换为c1=’1’and c3=’3’orc2=’2’and c3=’3’,再按照方法“or”与“and”的连接关系进行拆分。
需要说明的是,第二检索条件的拆分规则与第一检索条件的拆分规则完全相同,此处不再赘述第二检索条件的拆分规则。
当每一个元素都拆分完毕时,根据每一个拆分得到的子节点及其所属的父节点构建语法树,分别得到所述第一集合对应的第一语法树以及所述第二集合对应的第二语法树。
具体的,在步骤S130中,判定所述第一语法树以及所述第二语法树是否等价。首先可以从元素的数量上判断所述第一集合以及所述第二集合是否一致,第一如果两个集合的大小不一致,那么集合肯定不相等。因此,先从集合中元素的数量进行初步判断,能够筛除一部分肯定不会重复的任务,减少了对比次数。
若两个集合的元素数量相同,即大小一致,可以依次从第一个集合中选择元素,判断其在第二个集合中是否存在。如果有不存在的,则两个集合肯定不相同,若存在,则进行下一步元素一致性的判断。如果集合中的元素是子集合,则可借助于语法树,依次判断所述子集合是否一致从而判定两个元素是否一致。
值得注意的是,排序字段的先后顺序(order_by_clauses)对分布式任务的重复性分析是有影响的,因此,当所述第一集合中包含所述第一排序字段以及当所述第二集合中包含所述第二排序字段时,按位对比所述第一排序字段的值以及所述第二排序字段的值是否一致;若一致,则判定所述第一字段以及所述第二字段具有重复性。
除外排序字段之外,对于集合的其他元素而言,其值的顺序是不重要的。例如,检索字段为select c1,c2和检索字段为select c2,c1可以看成是相同的SQL。检索条件中where c1=1and c2=2和where c2=1and c1=1是相同的;Group_by_clauses中group by c1,c2和group by c2,c1是相同的。在现有技术的对比过程中,通常这些顺序颠倒的字段认为是不同的,这样就会导致重复性分析过程出现很多漏洞。采用本申请实施例的技术方案时,将SQL查询语句拆分成单个的字段,忽略字段顺序对查询结果的影响,不需要考虑颠倒的顺序,只考虑字段内容是否一致即可,从而实现了更准确的重复性分析。
SQL语句中,引号内的内容通常是不同字段对应的值,不在引号内的部分中包含的空格、制表符(tab键)、换行符是没有意义的,仅仅这些字符不同的两个SQL语句应该认为是相同的。举例如下:检索条件部分“where city=’北京’”,where后面加任意个空格是没有意义的。但是city=’北京’和city=’北京’,意思不一样。与此同时,SQL语句的不在引号内的部分的大小写不会引起结果的不同,但是按照现有技术的比对方法,其重复性是无法分析出来的。
因此,优选的,本申请实施例中,根据关键字对第一SQL查询语句与第二SQL查询语句进行拆分之前,还可以包括如下步骤:
将所述第一SQL查询语句以及所述第二SQL查询语句中,将查询值以外的字段中存在的无用符去除,并将字母转化为统一的大小写;其中,所述无用符包括空格、制表符、换行符。从而实现了更加准确的重复性分析。
本实施例中,通过对SQL查询语句进行拆分并生成语法树,通过判定任意两个SQL查询语句对应的语法树是否一致来进行重复性分析,改变了现有技术中进行重复性分析时,由于SQL查询语句中字段顺序颠倒造成的重复性分析效率低的缺陷,实现了高正确率的重复性分析,提高了分布式资源的利用率。
图2是本申请实施二的第一语法树的形状示意图,以下部分将结合图2,以第一语法树的生成过程为例对本申请实施例进行进一步阐述。
如图2所示,假设第一SQL查询语句对当前hive任务表中的任务1进行查询,可将任务1作为第一语法树的根节点。首先对所述第一SQL查询语句进行拆分,得到第一集合,第一集合中的元素包括第一检索字段、第一检索表名、第一检索条件、第一分组条件以及第一排序字段。将第一集合中的元素作为第一语法树的第一层子节点。
之后,对每一个子节点进行拆分,例如,第一检索字段field=“select c1,c2”,则根据c1,c2之间的逗号连接关系可将第一检索字段拆分为两部分,即c1和c2。其中,c1和c2分别作为第一检索字段的两个子节点,也就是第一语法树的第二层节点,具体如图2所示。
对于单表查询而言,其检索表名通常只含有一个字段。第一检索表名只有一个子节点,也位于语法树的第二层,本实施例中,假设第一检索表名为tableA。
第一检索条件的子节点可以有多层,第一检索条件的第一层子节点位于第一语法树的第二层,主要是各类操作符,如图2所示的逻辑或运算or、=、<>、like等。第一检索条件的第二层子节点位于第一语法树的第三层,主要是检索条件对应的值。例如,当所述第一检索条件Conditions为c1=’1’and c2=‘2’or c3=‘3’时,c1=’1’以及c2=‘2’之间是and的连接关系,因此,c1=’1’以及c2=‘2’将被拆分为操作符or下的同一个子节点的两个不同部分;c3=‘3’与其前述的c1=’1’及c2=‘2’之间是or的连接关系,因此c2=‘3’将被拆分为or下的另一个子节点。
采用上述方法,将另一任务对应的第二SQL查询语句拆分成第二语法树。在进行重复性分析时,首先判断第一集合以及第二集合对应的元素数量是否相同,即第一语法树和第二语法树的第一层子节点的数量是否一致,若一致,则说明这两个语法树有一致的可能性,则可以进行以下的比对步骤。
从第一集合中选取一个元素,判断这一元素是否在第二集合中,若这一元素具有子集合,则可以借助语法树中这一元素对应的子树判断这一元素与第二集合中相应的元素是否一致。例如,图2中所示的第一语法树中,第一检索字段、第一检索表名、第一检索条件是有值的,则可先读取第一检索字段的值,并查询第二集合中第二检索字段的值是否与第一检索字段的值一致;其次,读取第一检索表名的值,并判断其是否与第二检索表名的值一致;
当判断第一检索条件与第二检索条件的值是否一致时,首先判断其对应的操作符是否一致,若一致,则判断每个操作符下对应的值的集合是否相互包含,即在不考虑顺序的情况下,值是一致的,若一致,则判定第一检索条件与第二检索条件是一致的。
在比对过程中,不仅需要判断第一集合中的元素是否都在第二集合中且对应的值是一致的,还需要判断第二集合中的元素是否都在第一集合中且对应的值是一致的。即两个集合是等价的,从而,即可判定第一SQL查询语句对应的任务1与第二SQL查询语句对应的任务2是重复的。
优选的,本申请实施例中,在构建语法树之后,分别将所述第一语法树和所述第二语法树转化为相应的哈希码;若判定所述第一语法树的哈希码与所述第二语法树的哈希码不相同,则判定所述第一SQL查询语句与所述第二SQL查询语句不具有重复性。
由于分布式处理系统中,系统中每天运行数万多个SQL,需要比较的次数是上亿多次比较。为了降低比较的次数,采用了基于哈希码的快速比较法。其基本算法如下:将每个语法树生成哈希码,哈希码的生成规划:语法树的哈希码等于各部分的哈希码相加。如果某部分是集合,它的哈希码等于各子集的哈希码,依次类推。
若两个语法树相同,则其对应生成的哈希码也相同,只需要比较哈希码相同的两个语法树即可,极大地减少了比较次数。
本实施例中,通过将SQL查询语句拆分成单个的字段并构建语法树,在重复性分析时,忽略了字段顺序对查询结果的影响,从而实现了更准确的重复性分析;与此同时,将语法树转化为对应的哈希码,根据哈希码是否相同来判定语法树是否一致,实现了快速高效的重复性分析。
图3是本申请实施例三的装置结构示意图,结合图3,一种重复性分析装置,包括如下的模块:
拆分模块310,用于根据预设的关键字对第一SQL查询语句与第二SQL查询语句进行拆分,分别获得与所述第一SQL查询语句相对应的第一集合以及与所述第二SQL查询语句对应的第二集合;
所述拆分模块310,还用于对所述第一集合以及所述第二集合中的每一元素的值进行拆分,分别得到所述第一集合对应的第一语法树以及所述第二集合对应的第二语法树;
分析模块320,用于当根据所述第一语法树以及所述第二语法树判定所述第一集合中的元素都包含于所述第二集合,且所述第二集合中的元素都包含于所述第一集合,则判定所述第一SQL查询语句与所述第二SQL查询语句具有重复性。
其中,所述第一集合中的元素包括:第一检索字段、第一检索表名、第一检索条件、第一分组条件以及第一排序字段;其中,所述第一集合中的元素构建所述第一语法树的第一层节点;
所述第二集合中的元素包括:第二检索字段、第二检索表名、第二检索条件、第二分组条件以及第二排序字段;其中,所述第二集合中的元素构建所述第二语法树的第一层节点。
其中,所述拆分模块310具体用于:当所述第一检索字段的值或所述第二检索字段的值包含有至少两个字段时,根据字段之间的符号连接,对所述至少两个字段进行拆分从而分别得到所述第一检索字段的子节点以及所述第二检索字段的子节点。
其中,所述拆分模块310具体用于:当所述第一检索条件的值中包含带有操作符的检索条件时,按照所述操作符对所述检索条件进行拆分并将所述操作符作为所述第一检索条件的子节点;
当所述第二检索条件的值中包含带有操作符的检索条件时,按照所述操作符对所述检索条件进行拆分并将所述操作符作为所述第二检索条件的子节点。
其中,所述拆分模块310具体用于:当所述操作符中存在逻辑或时,按照逻辑或的数量将所述检索条件拆分为相应数量的所述逻辑或的子节点;
当所述操作符中存在逻辑与时,将逻辑与连接的检索条件拆分为同一个子节点。
其中,所述分析模块320具体用于:当所述第一集合中包含所述第一排序字段以及当所述第二集合中包含所述第二排序字段时,按位对比所述第一排序字段的值以及所述第二排序字段的值是否一致;
若一致,则判定所述第一字段以及所述第二字段具有重复性。
其中,所述装置还包括预处理模块330,所述预处理模块330用于:根据关键字对第一SQL查询语句与第二SQL查询语句进行拆分之前,将所述第一SQL查询语句以及所述第二SQL查询语句中,将查询值以外的字段中存在的无用符去除,并将字母转化为统一的大小写;其中,所述无用符包括空格、制表符、换行符。
其中,所述分析模块320还用于:分别将所述第一语法树和所述第二语法树转化为相应的哈希码;若判定所述第一语法树的哈希码与所述第二语法树的哈希码不相同,则判定所述第一SQL查询语句与所述第二SQL查询语句不具有重复性。
图3所示装置可以执行图1以及图2所示实施例的方法,实现原理和技术效果参考图1以及图2所示实施例,不再赘述。
应用实例
以下部分将结合具体的应用场景,以一个具体的例子来对本申请实施例的技术方案进一步阐述。
某一业务部门对一个hive任务表进行分析,目标是想要得知hive任务表中的哪些任务是重复的,从而定位重复任务,将更多的计算资源用于其他计算。
利用SQL单表查询语句:SELECT fields FROM tableName WHEREconditions GROUP BY group_by_clauses ORDER BY order_by_clauses对hive任务表中的每一任务进行查询,得到查询输出结果。
假设,任务1的SQL单表查询结果为SELECT‘a,b,c’FROM tableAWHERE(a=’1’or b=’2’)and c=’3’GROUP BY a,b,c ORDER BY a,b,c;即查询结果中,各字段的值如下:
fields=‘a,b,c’
tableName=’tableA’
conditions:(a=’1’or b=’2’)and c=’3’
group_by_clauses:group by a,b,c
order_by_clauses:order by a,b,c
任务2的SQL单表查询结果为select‘c,b,a’FROM tableA where a=’1’and c=’3’or b=’2’andc=’3’GROUP BY b,c,a order by a,b,c;即查询结果中,各字段的值如下:
fields=‘c,b,a’
tableName=’tableA’
conditions:a=’1’and c=’3’or b=’2’andc=’3’
group_by_clauses:group by b,c,a
order_by_clauses:order by a,b,c
假设,任务3的SQL单表查询结果为SELECT‘a,b,c’FROM tableAWHERE(a=’1’or b=’2’)and c=’3’GROUP BY a,b,c ORDER BY b,c,a;即查询结果中,各字段的值如下:
fields=‘a,b,c’
tableName=’tableA’
conditions:(a=’1’or b=’2’)and c=’3’
group_by_clauses:group by a,b,c
order_by_clauses:order by b,c,a
假设,任务4的SQL单表查询结果为SELECT‘a,b,c’FROM tableAWHERE(a=’1’or b=’2’)and c=’3’ORDER BY b,c,a;即查询结果中,各字段的值如下:
fields=‘a,b,c’
tableName=’tableA’
conditions:(a=’1’or b=’2’)and c=’3’
group_by_clauses:null
order_by_clauses:order by b,c,a
根据上述查询结果,首先可以判断任务1、任务2、任务3的SQL单表查询语句中除各字段的值以外的字段部分是否有大小写不一致或空格符、制表符、换行符等无用符的存在。本实施例中,发现任务2中部分查询字段出现小写,任务3中,部分查询字段带有空格符,此时可以任务1为标准,将任务2中除各字段的值以外的字段部分的小写字母统一转化为大写字母,与此同时,去除任务三中除各字段的值以外的字段部分的空格符去掉,得到如下所示结果:
任务2:SELECT‘c,b,a’FROM tableA WHERE a=’1’and c=’3’or b=’2’andc=’3’GROUP BY b,c,a order by a,b,c;
任务3:SELECT‘a,b,c’FROM tableA WHERE(a=’1’or b=’2’)and c=’3’GROUP BY a,b,c ORDER BY b,c,a;
完成预处理工作后,首先根据预设的关键字,即Fields、conditions、group_by_clauses、order by clauses分别对任务1、任务2、任务3、任务4的查询语句进行拆分,得到对应的四个集合:
集合1:{fields,tableName,conditions、group_by_clauses、order_by_clauses}
集合2:{fields,tableName,conditions、group_by_clauses、order_by_clauses}
集合3:{fields,tableName,conditions、group_by_clauses、order_by_clauses}
集合4:{fields,tableName,conditions、order_by_clauses}
在这一步之后,对四个集合中的每一个元素的值进行拆分,分别得到四个语法树,如图4-1、图4-2、图4-3、图4-4所示。
具体拆分过程以集合1为例,集合1中,fields=‘a,b,c’,按照逗号进行拆分,则fields对应的子集合为{a,b,c};tableName对应一个单元素集合为{tableA};对conditions的值进行拆分时,首先去括号,得到a=’1’and c=’3’orb=’2’and c=’3’,按照逻辑符号进行拆分,得到对应的子集合为{a=’1’andc=’3’,b=’2’and c=’3’};group by a,b,c,按照逗号进行拆分,得到{a,b,c};order by a,b,c按照逗号进行拆分,,得到{a,b,c}。根据上述的拆分结果以及从属关系即可构建如图4-1所示的语法树,集合2~集合4的拆分过程与上述过程同理,不再赘述。
得到4个语法树之后,遍历对比任意两个语法树是否一致。图4-1对应的语法树1中,第一层子节点中包含五个元素,同图4-2对应的语法树2以及图4-3对应的语法树3,然而图4-4对应的语法树4中,第一层子节点中只包含有四个元素,则可判定任务4与任务1~任务3中的任意一个都不是重复任务,因此,接下来只需对比任务1~任务3中的任意两个是否为重复任务。
对比任务1和任务2是否为重复任务时,依次判断每一个子树是否一致。从任务1的第一个子树开始,fields包含三个子节点,且每个子节点都能在任务2的第一个子树中找到,与此同时,任务2的第一个子树中包含的三个子节点也都能够在任务1的第一个子树中找到,即可判断这两个子树是相同的。用同样的方法,一次判断剩余的四个子树是否一致。根据图4-1和4-2,能够快速判定,任务1和任务2的前四个子树是相同的,第五个子树不仅内容相同,子树中子节点的顺序也相同,因此,可判定,任务1和任务2是重复任务。
反观图4-3中的语法树,前四个子树和任务1以及任务2中对应语法树的前四个子树相同,但是第五个子树中,任务3的排序字段顺序与任务1以及任务2都不同,而排序字段的顺序对任务的影响很大,因此,可以判断,任务3和任务1以及任务2不是重复任务。
以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性的劳动的情况下,即可以理解并实施。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到各实施方式可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件。基于这样的理解,上述技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在计算机可读存储介质中,如ROM/RAM、磁碟、光盘等,包括若干指令用以使得一台计算机装置(可以是个人计算机,服务器,或者网络装置等)执行各个实施例或者实施例的某些部分所述的方法。
最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。
Claims (16)
1.一种重复性分析方法,其特征在于,包括如下的步骤:
根据预设的关键字对第一SQL查询语句与第二SQL查询语句进行拆分,分别获得与所述第一SQL查询语句相对应的第一集合以及与所述第二SQL查询语句对应的第二集合;
对所述第一集合以及所述第二集合中的每一元素的值进行拆分,分别得到所述第一集合对应的第一语法树以及所述第二集合对应的第二语法树;
根据所述第一语法树以及所述第二语法树判定所述第一集合中的元素都包含于所述第二集合,且所述第二集合中的元素都包含于所述第一集合,则判定所述第一SQL查询语句与所述第二SQL查询语句具有重复性。
2.根据权利要求1所述的方法,其特征在于,
所述第一集合中的元素包括:第一检索字段、第一检索表名、第一检索条件、第一分组条件以及第一排序字段;其中,所述第一集合中的元素构建所述第一语法树的第一层节点;
所述第二集合中的元素包括:第二检索字段、第二检索表名、第二检索条件、第二分组条件以及第二排序字段;其中,所述第二集合中的元素构建所述第二语法树的第一层节点。
3.根据权利要求2所述的方法,其特征在于,对所述第一集合以及所述第二集合中的每一元素的值进行拆分,具体包括:
当所述第一检索字段的值或所述第二检索字段的值包含有至少两个字段时,根据字段之间的符号连接,对所述至少两个字段进行拆分从而分别得到所述第一检索字段的子节点以及所述第二检索字段的子节点。
4.根据权利要求2所述的方法,其特征在于,对所述第一集合以及所述第二集合中的每一元素的值进行拆分,具体包括:
当所述第一检索条件的值中包含带有操作符的检索条件时,按照所述操作符对所述检索条件进行拆分并将所述操作符作为所述第一检索条件的子节点;
当所述第二检索条件的值中包含带有操作符的检索条件时,按照所述操作符对所述检索条件进行拆分并将所述操作符作为所述第二检索条件的子节点。
5.根据权利要求4所述的方法,其特征在于,所述方法具体包括:
当所述操作符中存在逻辑或时,按照逻辑或的数量将所述检索条件拆分为相应数量的所述逻辑或的子节点;
当所述操作符中存在逻辑与时,将逻辑与连接的检索条件拆分为同一个子节点。
6.根据权利要求2所述的方法,其特征在于,判定所述第一SQL查询语句与所述第二SQL查询语句具有重复性,具体包括:
当所述第一集合中包含所述第一排序字段以及当所述第二集合中包含所述第二排序字段时,按位对比所述第一排序字段的值以及所述第二排序字段的值是否一致;
若一致,则判定所述第一字段以及所述第二字段具有重复性。
7.根据权利要求1所述的方法,其特征在于,根据关键字对第一SQL查询语句与第二SQL查询语句进行拆分之前,还包括:
将所述第一SQL查询语句以及所述第二SQL查询语句中,将查询值以外的字段中存在的无用符去除,并将字母转化为统一的大小写;其中,所述无用符包括空格、制表符、换行符。
8.根据权利要求1所述的方法,其特征在于,所述方法还包括:
分别将所述第一语法树和所述第二语法树转化为相应的哈希码;
若判定所述第一语法树的哈希码与所述第二语法树的哈希码不相同,则判定所述第一SQL查询语句与所述第二SQL查询语句不具有重复性。
9.一种重复性分析装置,其特征在于,包括如下的模块:
拆分模块,用于根据预设的关键字对第一SQL查询语句与第二SQL查询语句进行拆分,分别获得与所述第一SQL查询语句相对应的第一集合以及与所述第二SQL查询语句对应的第二集合;
所述拆分模块,还用于对所述第一集合以及所述第二集合中的每一元素的值进行拆分,分别得到所述第一集合对应的第一语法树以及所述第二集合对应的第二语法树;
分析模块,用于当根据所述第一语法树以及所述第二语法树判定所述第一集合中的元素都包含于所述第二集合,且所述第二集合中的元素都包含于所述第一集合,则判定所述第一SQL查询语句与所述第二SQL查询语句具有重复性。
10.根据权利要求9所述的装置,其特征在于,
所述第一集合中的元素包括:第一检索字段、第一检索表名、第一检索条件、第一分组条件以及第一排序字段;其中,所述第一集合中的元素构建所述第一语法树的第一层节点;
所述第二集合中的元素包括:第二检索字段、第二检索表名、第二检索条件、第二分组条件以及第二排序字段;其中,所述第二集合中的元素构建所述第二语法树的第一层节点。
11.根据权利要求10所述的装置,其特征在于,所述拆分模块具体用于:
当所述第一检索字段的值或所述第二检索字段的值包含有至少两个字段时,根据字段之间的符号连接,对所述至少两个字段进行拆分从而分别得到所述第一检索字段的子节点以及所述第二检索字段的子节点。
12.根据权利要求10所述的装置,其特征在于,所述拆分模块具体用于:
当所述第一检索条件的值中包含带有操作符的检索条件时,按照所述操作符对所述检索条件进行拆分并将所述操作符作为所述第一检索条件的子节点;
当所述第二检索条件的值中包含带有操作符的检索条件时,按照所述操作符对所述检索条件进行拆分并将所述操作符作为所述第二检索条件的子节点。
13.根据权利要求12所述的装置,其特征在于,所述拆分模块具体用于:
当所述操作符中存在逻辑或时,按照逻辑或的数量将所述检索条件拆分为相应数量的所述逻辑或的子节点;
当所述操作符中存在逻辑与时,将逻辑与连接的检索条件拆分为同一个子节点。
14.根据权利要求10所述的装置,其特征在于,所述分析模块具体用于:
当所述第一集合中包含所述第一排序字段以及当所述第二集合中包含所述第二排序字段时,按位对比所述第一排序字段的值以及所述第二排序字段的值是否一致;
若一致,则判定所述第一字段以及所述第二字段具有重复性。
15.根据权利要求9所述的装置,其特征在于,所述装置还包括预处理模块,所述预处理模块用于:
根据关键字对第一SQL查询语句与第二SQL查询语句进行拆分之前,将所述第一SQL查询语句以及所述第二SQL查询语句中,将查询值以外的字段中存在的无用符去除,并将字母转化为统一的大小写;其中,所述无用符包括空格、制表符、换行符。
16.根据权利要求9所述的装置,其特征在于,所述分析模块还用于:
分别将所述第一语法树和所述第二语法树转化为相应的哈希码;
若判定所述第一语法树的哈希码与所述第二语法树的哈希码不相同,则判定所述第一SQL查询语句与所述第二SQL查询语句不具有重复性。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201610251980.1A CN105930453A (zh) | 2016-04-21 | 2016-04-21 | 重复性分析方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201610251980.1A CN105930453A (zh) | 2016-04-21 | 2016-04-21 | 重复性分析方法及装置 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN105930453A true CN105930453A (zh) | 2016-09-07 |
Family
ID=56838751
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201610251980.1A Pending CN105930453A (zh) | 2016-04-21 | 2016-04-21 | 重复性分析方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN105930453A (zh) |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2020057272A1 (zh) * | 2018-09-18 | 2020-03-26 | 厦门市美亚柏科信息股份有限公司 | 一种索引数据存储及检索方法、装置及存储介质 |
CN113268495A (zh) * | 2021-05-25 | 2021-08-17 | 深圳壹账通智能科技有限公司 | 数据搜索方法、装置、电子设备及存储介质 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102185930A (zh) * | 2011-06-09 | 2011-09-14 | 北京理工大学 | 一种sql注入漏洞检测方法 |
CN104123497A (zh) * | 2014-07-04 | 2014-10-29 | 北京神州绿盟信息安全科技股份有限公司 | 一种防御sql注入的方法、装置及系统 |
-
2016
- 2016-04-21 CN CN201610251980.1A patent/CN105930453A/zh active Pending
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102185930A (zh) * | 2011-06-09 | 2011-09-14 | 北京理工大学 | 一种sql注入漏洞检测方法 |
CN104123497A (zh) * | 2014-07-04 | 2014-10-29 | 北京神州绿盟信息安全科技股份有限公司 | 一种防御sql注入的方法、装置及系统 |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2020057272A1 (zh) * | 2018-09-18 | 2020-03-26 | 厦门市美亚柏科信息股份有限公司 | 一种索引数据存储及检索方法、装置及存储介质 |
CN113268495A (zh) * | 2021-05-25 | 2021-08-17 | 深圳壹账通智能科技有限公司 | 数据搜索方法、装置、电子设备及存储介质 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Soibelman et al. | Management and analysis of unstructured construction data types | |
CN102135938B (zh) | 一种软件产品测试方法及系统 | |
CN107306196A (zh) | 虚拟化服务监控方法和装置 | |
CN112749284B (zh) | 知识图谱构建方法、装置、设备及存储介质 | |
CN107506389B (zh) | 一种提取职位技能需求的方法和装置 | |
CN111949306B (zh) | 一种支持开源项目碎片化学习的推送方法和系统 | |
CN109285024B (zh) | 在线特征确定方法、装置、电子设备及存储介质 | |
CN111447224A (zh) | web漏洞扫描方法及漏洞扫描器 | |
CN112632239A (zh) | 基于人工智能技术的类脑问答系统 | |
CN110263021B (zh) | 一种基于个性化标签体系的主题库生成方法 | |
CN114817243A (zh) | 数据库联合索引的建立方法、装置、设备及存储介质 | |
CN111159135A (zh) | 数据处理方法、装置、电子设备及存储介质 | |
WO2016093839A1 (en) | Structuring of semi-structured log messages | |
CN105930453A (zh) | 重复性分析方法及装置 | |
CN106250366A (zh) | 一种针对问答系统的数据处理方法及系统 | |
CN113157904A (zh) | 基于dfa算法的敏感词过滤方法及系统 | |
CN110929509B (zh) | 一种基于louvain社区发现算法的领域事件触发词聚类方法 | |
Eyal-Salman et al. | Feature-to-code traceability in legacy software variants | |
CN110968596A (zh) | 一种基于标签系统的数据处理方法 | |
CN114465875B (zh) | 故障处理方法及装置 | |
CN111026940A (zh) | 一种面向电网电磁环境的网络舆情及风险信息监测系统、电子设备 | |
CN112767933B (zh) | 公路养护管理系统的语音交互方法、装置、设备及介质 | |
CN114780589A (zh) | 多表连接查询方法、装置、设备及存储介质 | |
CN111143356B (zh) | 报表检索方法及装置 | |
CN110517070B (zh) | 一种消费者人群圈选方法及装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
WD01 | Invention patent application deemed withdrawn after publication |
Application publication date: 20160907 |
|
WD01 | Invention patent application deemed withdrawn after publication |