CN116662367A - 用于数据血缘的解析方法、存储介质及处理器 - Google Patents
用于数据血缘的解析方法、存储介质及处理器 Download PDFInfo
- Publication number
- CN116662367A CN116662367A CN202310436495.1A CN202310436495A CN116662367A CN 116662367 A CN116662367 A CN 116662367A CN 202310436495 A CN202310436495 A CN 202310436495A CN 116662367 A CN116662367 A CN 116662367A
- Authority
- CN
- China
- Prior art keywords
- clause
- keyword
- blood
- query
- identifier
- 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
- 239000008280 blood Substances 0.000 title claims abstract description 115
- 210000004369 blood Anatomy 0.000 title claims abstract description 115
- 238000003860 storage Methods 0.000 title claims abstract description 20
- 238000004458 analytical method Methods 0.000 title abstract description 44
- 238000013515 script Methods 0.000 claims abstract description 70
- 238000000034 method Methods 0.000 claims description 57
- 101100328884 Caenorhabditis elegans sqt-3 gene Proteins 0.000 description 38
- 230000006870 function Effects 0.000 description 17
- 230000008569 process Effects 0.000 description 17
- 238000010586 diagram Methods 0.000 description 15
- 101100328886 Caenorhabditis elegans col-2 gene Proteins 0.000 description 14
- 238000004590 computer program Methods 0.000 description 11
- 238000012545 processing Methods 0.000 description 8
- 101100237842 Xenopus laevis mmp18 gene Proteins 0.000 description 5
- 230000008859 change Effects 0.000 description 4
- 230000008901 benefit Effects 0.000 description 3
- 230000005540 biological transmission Effects 0.000 description 2
- 238000005516 engineering process Methods 0.000 description 2
- 238000012423 maintenance Methods 0.000 description 2
- 238000012986 modification Methods 0.000 description 2
- 230000004048 modification Effects 0.000 description 2
- 230000003287 optical effect Effects 0.000 description 2
- 101100328895 Caenorhabditis elegans rol-8 gene Proteins 0.000 description 1
- 208000007536 Thrombosis Diseases 0.000 description 1
- 238000013459 approach Methods 0.000 description 1
- 238000004364 calculation method Methods 0.000 description 1
- 235000019219 chocolate Nutrition 0.000 description 1
- -1 col3 Proteins 0.000 description 1
- 238000004891 communication Methods 0.000 description 1
- 230000000052 comparative effect Effects 0.000 description 1
- 230000014509 gene expression Effects 0.000 description 1
- 238000003306 harvesting Methods 0.000 description 1
- 230000006872 improvement Effects 0.000 description 1
- 238000004519 manufacturing process Methods 0.000 description 1
- 238000011084 recovery Methods 0.000 description 1
- 230000003068 static effect Effects 0.000 description 1
- 238000013519 translation Methods 0.000 description 1
- 238000011144 upstream manufacturing Methods 0.000 description 1
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
- 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/26—Visual data mining; Browsing structured data
-
- 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
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Databases & Information Systems (AREA)
- Computational Linguistics (AREA)
- Data Mining & Analysis (AREA)
- Mathematical Physics (AREA)
- Health & Medical Sciences (AREA)
- Artificial Intelligence (AREA)
- Audiology, Speech & Language Pathology (AREA)
- General Health & Medical Sciences (AREA)
- Machine Translation (AREA)
Abstract
本申请实施例提供一种用于数据血缘的解析方法、处理器及存储介质。解析方法包括:获取待解析的结构化查询语言脚本,结构化查询语言脚本至少包括一个结构化查询语句;对结构化查询语言脚本进行解析,以生成与结构化查询脚本对应的抽象语法树,其中,抽象语法树包括不同类型的标识和标识列表;采用分段式搜索方式拆分抽象语法树,以得到抽象语法树的多个子语句;根据多个子语句确定抽象语法树包含的血缘数据目标表和标识符;在抽象语法树拆分完毕的情况下,根据血缘数据目标表和标识符对抽象语法树进行解析以得到结构化查询语言脚本的血缘数据。
Description
技术领域
本申请涉及计算机数据处理技术领域,具体涉及一种用于数据血缘的解析方法、存储介质及处理器。
背景技术
工程机械行业的数据血缘需求主要来源于工程机械行业数据仓库运维过程。在数据仓库运维过程中,数据仓库任务失败后的任务恢复需要明确当前任务的上下游依赖,数据仓库字段的逻辑变更同样也影响着下游库表,变更逻辑后需及时通知下游。因此,如何发现数据的引用链与影响链即血缘数据关系成为数据仓库面临的共同问题。
目前,传统方法主要通过使用离线解析与在线解析相结合的方式,来获得SQL脚本内的血缘数据,其中包含的预解析的过程会使得实际解析流程中会存在两次解析,需要耗费大量的时间。且目前的离线解析方法无法获取表或字段的元数据,无法处理SQL脚本中有*的情况。
发明内容
本申请实施例的目的是提供一种用于数据血缘的解析方法、存储介质及处理器。
为了实现上述目的,本申请第一方面提供一种用于数据血缘的解析方法,包括:
获取待解析的结构化查询语言脚本,结构化查询语言脚本至少包括一个结构化查询语句;
对结构化查询语言脚本进行解析,以生成与结构化查询脚本对应的抽象语法树,其中,抽象语法树包括不同类型的标识和标识列表;
采用分段式搜索方式拆分抽象语法树,以得到抽象语法树的多个子语句;
根据多个子语句确定抽象语法树包含的血缘数据目标表和标识符;
在抽象语法树拆分完毕的情况下,根据血缘数据目标表和标识符对抽象语法树进行解析以得到结构化查询语言脚本的血缘数据。
在一个实施例中,标识至少包括第一类型关键字、第二类型关键字、第一关键字、第二关键字以及第三关键字,采用分段式搜索方式拆分抽象语法树,以得到抽象语法树的多个子语句包括:判断抽象语法树的第一个层级的标识是否为第一类型关键字;在第一个层级的标识是第一类型关键字的情况下,将抽象语法树拆分为第一类型子句和第二类型子句,其中,第一类型子句是由第一字节和第二字节构成的子句;将第一类型子句中位于第一字节之后的部分确定为第一标识符,并根据第一标识符确定第一类型子句的第一血缘数据目标表,并将第一类型子句中位于第二字节之后的子查询内的结构化查询语句确定为第一联合查询子句;根据第一联合查询子句中包括第一关键字的情况对抽象语法树进行拆分。
在一个实施例中,解析方法还包括:在第一个层级的标识不是第一类型关键字的情况下,确定第一个层级的标识为第二类型关键字;将第二类型子句之后出现的第一个标识符确定为第二类型子句的第二血缘数据目标表;根据第二类型子句中包括第一关键字的情况对抽象语法树进行拆分。
在一个实施例中,第一关键字为联合查询关键字,根据第一联合查询子句中包括第一关键字的情况对抽象语法树进行拆分包括:在第一联合查询子句中包括联合查询关键字的情况下,判断第一联合查询子句后的第一个选择关键字是否位于第一个联合查询关键字之前;在第一联合查询子句后的第一个选择关键字位于第一个联合查询关键字之前的情况下,将第一个选择关键字与第一个联合查询关键字之间的标识组合为第一个联合查询子句;在第一联合查询子句后的第一个选择关键字位于第一个联合查询关键字之后的情况下,将第一个联合查询关键字之前的第一个标识符或子查询确定为第一个联合查询子句,并将每个联合查询关键字之间以及最后一个联合查询关键字之后的标识确定为其他的联合查询子句;将第一个联合查询子句和其他的联合查询子句均转换为以选择关键字为开头的第一选择子句,并将第一血缘数据目标表确定为第一选择子句的第三血缘数据目标表;判断第一选择子句中第一个标识是否为选择关键字,以根据第一个标识的情况对抽象语法树进行拆分。
在一个实施例中,解析方法还包括:在第一联合查询子句中不包括联合查询关键字的情况下,获取第一联合查询子句后的第一个选择关键字;将第一联合查询子句后的第一个选择关键字与第一联合查询子句后的第一个选择关键字之后的标识列表确定为第二选择子句;判断第二选择子句中的第一个标识是否为选择关键字,以根据第一个标识的情况对抽象语法树进行拆分。
在一个实施例中,第一关键字为联合查询关键字,根据第二类型子句中包括第一关键字的情况对抽象语法树进行拆分包括:在第二类型子句中包括联合查询关键字的情况下,判断第二类型子句后的第一个选择关键字是否位于第一个联合查询关键字之前;在第二类型子句后的第一个选择关键字位于第一个联合查询关键字之前的情况下,将第一个选择关键字与第一个联合查询关键字之间的标识组合为第一个联合查询子句;在第二类型子句后的第一个选择关键字位于第一个联合查询关键字之后的情况下,将第一个联合查询关键字之前的第一个标识符或子查询确定为第一个联合查询子句,并将位于每个联合查询关键字之间以及最后一个联合查询关键字之后的标识确定为其他的联合查询子句;将第一个联合查询子句和其他的联合查询子句均转换为以选择关键字为开头的第三选择子句,并将第二血缘数据目标表确定为第二选择子句的第四血缘数据目标表;判断第三选择子句中的第一个标识是否为选择关键字,以根据第一个标识的情况对抽象语法树进行拆分。
在一个实施例中,解析方法还包括:在第二类型子句中不包括联合查询关键字的情况下,获取第二类型子句后的第一个选择关键字;将第二类型子句后的第一个选择关键字与第二类型子句后的第一个选择关键字之后的标识列表确定为第四选择子句;判断第四选择子句中的第一个标识是否为选择关键字,以根据第一个标识的情况对抽象语法树进行拆分。
在一个实施例中,根据第一个标识的情况对抽象语法树进行拆分包括:在第一个标识是选择关键字的情况下,将位于选择关键字与第二关键字之间的子句确定为字段域子句,并获取字段域子句中包含的第二标识符;判断第二关键字之后的标识列表是否包括第三关键字;在第二关键字之后的标识列表包括第三关键字的情况下,将位于第二关键字与第三关键字之间的子句确定为等值连接子句;在第二关键字之后的标识列表不包括第三关键字的情况下,将位于第二关键字之后的标识符确定为表检索子句。
在一个实施例中,解析方法还包括:在第一个标识不是选择关键字的情况下,确定抽象语法树的第一层级拆分完毕;根据字段域子句确定结构化查询语言脚本的血缘数据。
在一个实施例中,血缘数据包括列级血缘数据,根据字段域子句确定结构化查询语言脚本的血缘数据包括:判断字段域子句中的标识符是否存在别名;在字段域子句中的标识符存在别名的情况下,将存在别名的标识符的当前位置和别名与第一血缘数据目标表、第二血缘数据目标表、第三血缘数据目标表以及第四血缘数据目标表中的任意一者组合为列级血缘的右列;在字段域子句中的标识符不存在别名的情况下,将字段域子句中的标识符的字段名与第一血缘数据目标表、第二血缘数据目标表、第三血缘数据目标表以及第四血缘数据目标表中的任意一者组合为列级血缘的右列;根据字段域子句中的标识符的第一个标识的类型确定列级血缘的左列;将列级血缘的右列与列级血缘的左列进行组合,以得到列级血缘数据。
在一个实施例中,抽象语法树的第一层级拆分完毕之后,根据等值连接子句和表检索子句确定结构化查询语言脚本的血缘数据。
在一个实施例中,血缘数据包括表级血缘数据,根据等值连接子句和表检索子句确定结构化查询语言脚本的血缘数据包括:获取等值连接子句与表检索子句中每个标识符的数据库名和表名;将数据库名和表名组合为表级血缘的左列;将左列与第一血缘数据目标表、第二血缘数据目标表、第三血缘数据目标表以及第四血缘数据目标表中的任意一者进行组合,以得到表级血缘数据。
在一个实施例中,解析方法还包括:判断等值连接子句与表检索子句中的标识符的第一个标识是否为子查询;在等值连接子句与表检索子句中的标识符的第一个标识是子查询的情况下,对抽象语法树的第二层级进行解析;在等值连接子句与表检索子句中的标识符的第一个标识不是子查询的情况下,确定抽象语法树拆分完毕。
在一个实施例中,对抽象语法树存在第二层级进行解析包括:获取子查询中的标识符的别名;将子查询中的标识符的别名确定为抽象语法树的第一层的血缘数据目标表,并将子查询内的结构化查询语句确定为第二联合查询子句;并根据第二联合查询子句中的第一个标识的情况对抽象语法树存在第二层级进行解析。
本申请第二方面提供一种处理器,被配置成执行上述的用于数据血缘的解析方法。
本申请第三方面提供一种机器可读存储介质,该机器可读存储介质上存储有指令,该指令在被处理器执行时使得所述处理器被配置成执行上述的本申请第而方面提供一种处理器,被配置成执行上述的用于数据血缘的解析方法。
通过上述技术方案,拆分抽象语法树将血缘关系的链式搜索过程变为分段式搜索,再通过计算分段式血缘关系得到完整的链式血缘关系,只通过采用一种离线解析方式,不仅节约解析时间,还能够处理SQL脚本中有*的情况。
本申请实施例的其它特征和优点将在随后的具体实施方式部分予以详细说明。
附图说明
附图是用来提供对本申请实施例的进一步理解,并且构成说明书的一部分,与下面的具体实施方式一起用于解释本申请实施例,但并不构成对本申请实施例的限制。在附图中:
图1示意性示出了根据本申请实施例的用于数据血缘的解析方法的流程示意图;
图2示意性示出了根据本申请实施例的解析抽象语法树的示意图;
图3a示意性示出了根据本申请实施例的解析抽象语法树的流程图;
图3b示意性示出了根据本申请实施例的解析抽象语法树的另一流程图;
图3c示意性示出了根据本申请实施例的解析抽象语法树的又一流程图;
图4示意性示出了根据本申请实施例的计算机设备的内部结构图。
具体实施方式
为使本申请实施例的目的、技术方案和优点更加清楚,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,应当理解的是,此处所描述的具体实施方式仅用于说明和解释本申请实施例,并不用于限制本申请实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都属于本申请保护的范围。
图1示意性示出了根据本申请实施例的用于数据血缘的解析方法的流程示意图。如图1所示,在本申请一实施例中,提供了一种用于数据血缘的解析方法,包括以下步骤:
步骤101,获取待解析的结构化查询语言脚本,结构化查询语言脚本至少包括一个结构化查询语句。
步骤102,对结构化查询语言脚本进行解析,以生成与结构化查询脚本对应的抽象语法树,其中,抽象语法树包括不同类型的标识和标识列表。
步骤103,采用分段式搜索方式拆分抽象语法树,以得到抽象语法树的多个子语句。
步骤104,根据多个子语句确定抽象语法树包含的血缘数据目标表和标识符。
步骤105,在抽象语法树拆分完毕的情况下,根据血缘数据目标表和标识符对抽象语法树进行解析以得到结构化查询语言脚本的血缘数据。
数据仓库的数据血缘解析包括离线解析与在线解析两种方式,其中,离线解析是基于结构化查询语言关键字、结构化查询语言语法等使用正则表达式来解析结构化查询语言语句,并生成抽象语法树,再解析抽象语法树获得血缘数据的一种解析方式。离线解析方式无需实际运行结构化查询语言脚本,只关注结构化查询语言脚本内容,具有解析速度快的优点。但解析过程中并未结合数据仓库的元数据,所以无法处理结构化查询语言脚本中包含*的情况(这里的*非乘法运算符,而是结构化查询语言中指代表中所有字段的简写,下文出现的*均为此含义)。在线解析则先在结构化查询语言脚本运行过程中逻辑计划里获取抽象语法树,再解析抽象语法树获得血缘数据的一种解析方式。在线解析方式虽然结合了数据仓库的元数据,能够处理结构化查询语言脚本中包含*的情况,但需实际运行结构化查询语言语句,获取血缘数据的速度相比离线解析慢。
通常情况下,数据仓库的结构化查询语言脚本数量非常多,如若只采用在线解析的方式将会十分耗时。而如若采用离线解析与在线解析相结合的方式高效地获取数据仓库的血缘,获得血缘数据则会存在以下三个缺点:
1)在判断结构化查询语言脚本采用何种方法解析时,会先采用一种解析方式即预解析来达到判断该解析方式是否符合需求。因此,同一个结构化查询语言脚本在预解析与实际解析时,会存在解析两次的情况,存在重复计算,浪费时间。
2)虽然制定了结构化查询语言编写规范,但是在结构化查询语言脚本依旧会存在大量包含*的情况,这会不可避免地需要使用在线解析的方式来获取大部分结构化查询语言脚本的血缘数据。
3)采用离线解析方式解析过程中并未结合数据仓库元数据,无法处理结构化查询语言脚本中包含*的情况。
针对以上三个问题,本技术方案提出一种数据血缘的离线解析方法,通过将单个结构化查询语言语句分为不同的语句段之后,再解析这些语句段分别获得字段血缘。且本技术方案使用血缘的上下文信息,以及数据仓库的元数据信息,能够处理结构化查询语言脚本中有*的情况。
进一步地,处理器获取待解析的结构化查询语言脚本,其中,在结构化查询语言脚本中至少包括一个结构化查询语句。在获取到结构化查询语言脚本之后,根据结构化语言的翻译规则即标识和标识列表的定义规则将结构化查询语言脚本解析为抽象语法树。其中,抽象语法树是指对数据一般结构的描述,是应用层实体对数据结构的一种描述。在计算机科学中,抽象语法树即AST是变成语言的源代码的抽象语法结构的树状表现形式,树上的每个节点都表示源代码中的一种结构,之所以说语法是“抽象”的,是因为此处的语法并不会表示出真实语法中出现的每个细节。结构化查询语言是指SQL,是一种功能齐全的数据库语言,标识可以是指Token,标识列表可以是指Token列表,Token可以是指服务端生成的一串字符串。在本技术方案中,Token可以是指SQL中出现的每一个字符串,可以分为关键字例如create、insert、标识符例如col1、table1、函数名例如nvl、运算符例如+-*\、常数项例如123、‘nan’、等式例如a=b、注释例如--xxx脚本、空格例如‘’,标点符号例如,以及括号例如()等类型,例如在SQL语句中:select a,b,(d+e)from c中将select,from,a,b,c,d,e,+都可视为Token。此外,还可将不同类型的Token进行组合,形成关键字(如create、insert)、算式(如a+b)、函数(如nvl(a,b))、实体标识(如col1)、子SQL语句(如select(selectcol1from b)from a)、实体标识列表(如col1,col2),特殊函数(无括号,如Case when)、比较型运算(如col1>2)等类型的token列表。其中,算式、函数、实体标识、子SQL语句、实体标识列表、比较算式之间的关系为相互包含,比如在SQL语句中:select nvl(a,if(a>b,c,d))+(c*d)+if(a>b,c,d)+e as col1,col2from table1,select和from之间的所有token会被识别为实体标识列表,在实体标识列表里,nvl(a,if(a>b,c,d))+(c*d)+if(a>b,c,d)+e ascol1与col2会被识别为实体标识,在实体标识nvl(a,if(a>b,c,d))+(c*d)+if(a>b,c,d)+eas col1中nvl(a,if(a>b,c,d))+(c*d)+if(a>b,c,d)+e为算式,在算式nvl(a,if(a>b,c,d))+(c*d)+if(a>b,c,d)+e中nvl(a,if(a>b,c,d))为函数,(c*d)为子SQL语句,if(a>b,c,d)为函数,在函数if(a>b,c,d)中a>b为比较型算式。
进一步地,处理器获取待解析的SQL脚本,并对SQL脚本进行解析,生成对应的包含有不同类型Token和Token列表的抽象语法树。如图2所示,提供了一种抽象语法树的示意图,将SQL语句insert into testable select ws_sold_date_sk sold_date_sk,ws_ext_sales_price sales_price from web_sales解析成抽象语法树。
进一步地,在将结构化查询语言脚本解析成抽象语法树之后,处理器则采用分段式搜索方式将抽象语法树进行拆分,以得到抽象语法树的多个不同类型的子语句。具体地,将SQL脚本拆分为SQL子句,拆分依据为SQL子句内需包含完整的血缘关系,分段式搜索方式可以是指SQL脚本拆分按照优先级为with as子句优先于union关键字优先于from关键字优先于join关键字的顺序。根据拆分得到的多个子语句确定抽象语法树包含的血缘数据目标表和标识符,直至拆分至最后一个优先级之后则确定抽象语法树当前的层级已被拆分完毕,则根据血缘数据目标表和标识符对抽象语法树进行解析以得到与SQL脚本对应的血缘数据。其中,标识符是指用来标识某个实体的一个符号,在编程语言中,标识符是对于变量、常量、函数以及语句块使用的名字。
上述技术方案,拆分抽象语法树将血缘关系的链式搜索过程变为分段式搜索,再通过计算分段式血缘关系得到完整的链式血缘关系,只通过采用一种离线解析方式,不仅节约解析时间,还能够处理SQL脚本中有*的情况。
图1为一个实施例中用于数据血缘的解析方法的流程示意图。应该理解的是,虽然图1的流程图中的各个步骤按照箭头的指示依次显示,但是这些步骤并不是必然按照箭头指示的顺序依次执行。除非本文中有明确的说明,这些步骤的执行并没有严格的顺序限制,这些步骤可以以其它的顺序执行。而且,图1中的至少一部分步骤可以包括多个子步骤或者多个阶段,这些子步骤或者阶段并不必然是在同一时刻执行完成,而是可以在不同的时刻执行,这些子步骤或者阶段的执行顺序也不必然是依次进行,而是可以与其它步骤或者其它步骤的子步骤或者阶段的至少一部分轮流或者交替地执行。
在一个实施例中,如图3a所示,提供了解析抽象语法树的流程图。标识至少包括第一类型关键字、第二类型关键字、第一关键字、第二关键字以及第三关键字。具体地,在本技术方案中,第一类型关键字可以是指with as关键字,第一类型子句可以是指with as子句,第一类型子句的第一字节和第二字节可以分别是指with和as。第二类型关键字可以是指DDL/DML关键字,第二类型子句可以是指DDL/DML子句,其中,DML子句是指数据操作语言子句,例如如果一个数据库中的表是指一个盒子的话,那么数据就是盒子里面的巧克力,数据操作语言就是针对表里面的数据进行增加、删除以及修改等操作。DDL子句是指数据定义语言子句,数据定义语言就是让数据结构发生改变的语句。第一关键字可以是指union关键字,union关键字可以理解为联合查询关键字,第二关键字可以是指from关键字,from关键字可以理解为表检索关键,第三关键字可以是指join关键字,join关键字可以理解为等值连接关键字。
进一步地,处理器采用分段式搜索方式拆分抽象语法树的第一个层级,判断抽象语法树的第一个层级的标识是否为第一类型关键字,在第一个层级的标识是第一类型关键字的情况下,将抽象语法树拆分为第一类型子句和第二类型子句,其中,第一类型子句是由第一字节和第二字节构成的子句。将第一类型子句中位于第一字节之后的部分确定为第一标识符,并根据第一标识符确定第一类型子句的第一血缘数据目标表,并将第一类型子句中位于第二字节之后的子查询内的结构化查询语句确定为第一联合查询子句,根据第一联合查询子句中包括第一关键字的情况对抽象语法树进行拆分。具体地,图3a提供了解析抽象语法树的流程图。如图3a所示,判断抽象语法树的第一个层级的Token是否为with as关键字,若Token为with as关键字,则将抽象语法树拆分为with as子句和DDL/DML子句。针对于with as子句,位于with之后的AST会被识别为标识符或标识符列表,同时将as前的内容作为该段血缘数据的目标表,并获取as后的子查询内的SQL作为union子句。在将as后的子查询内的SQL作为union子句之后,根据union子句中的union关键字的情况对AST进行拆分。
在一个实施例中,若第一个层级的标识不是第一类型关键字的情况下,确定第一个层级的标识为第二类型关键字,将第二类型子句之后出现的第一个标识符确定为第二类型子句的第二血缘数据目标表,根据第二类型子句中包括第一关键字的情况对抽象语法树进行拆分。具体地,判断抽象语法树的第一个层级的Token是否为with as关键字,若Token不是with as关键字,则确定第一个层级的标识为DDL/DML关键字。并在确定第一个层级的标识为DDL/DML关键字的情况下,针对DDL或DML子句部分,将DDL子句或DML子句后出现的第一个标识符作为当前血缘数据的目标表,并根据DDL/DML子句中的union关键字的情况对AST进行拆分。
在一个实施例中,如图3a所示,提供了解析抽象语法树的流程图。第一关键字为联合查询关键字,根据第一联合查询子句中包括第一关键字的情况对抽象语法树进行拆分包括:在第一联合查询子句中包括联合查询关键字的情况下,判断第一联合查询子句后的第一个选择关键字是否位于第一个联合查询关键字之前。具体地,根据union子句中的union关键字的情况对AST进行拆分包括:在union子句中包括union关键字的情况下,判断union子句后的第一个select关键字是否位于第一个union关键字之前。在第一联合查询子句后的第一个选择关键字位于第一个联合查询关键字之前的情况下,将第一个选择关键字与第一个联合查询关键字之间的标识组合为第一个联合查询子句。具体地,当第一个select关键字位于第一个union关键字之前的情况下,将第一个select关键字与第一个union关键字之间的所有Token组合为第一个union子句。在第一联合查询子句后的第一个选择关键字位于第一个联合查询关键字之后的情况下,将第一个联合查询关键字之前的第一个标识符或子查询确定为第一个联合查询子句,并将每个联合查询关键字之间以及最后一个联合查询关键字之后的标识确定为其他的联合查询子句。具体地,当第一个select关键字位于第一个union关键字之后的情况下,将第一个union关键字之前的第一个标识符或子查询作为第一个union子句,并将每个union关键字之间以及最后一个union关键字之后的所有Token作为剩余的union子句。将第一个联合查询子句和其他的联合查询子句均转换为以选择关键字为开头的第一选择子句,并将第一血缘数据目标表确定为第一选择子句的第三血缘数据目标表。判断第一选择子句中第一个标识是否为选择关键字,以根据第一个标识的情况对抽象语法树进行拆分。具体地,将第一个union子句和剩余的union子句都转换为select开头的select子句,并将with as子句中as前的内容也作为该段血缘的目标表。并判断select子句中的第一个Token是否为select关键字,从而根据第一个Token的情况对AST进行进一步地拆分。
在一个实施例中,在第一联合查询子句中不包括联合查询关键字的情况下,获取第一联合查询子句后的第一个选择关键字。将第一联合查询子句后的第一个选择关键字与第一联合查询子句后的第一个选择关键字之后的标识列表确定为第二选择子句。判断第二选择子句中的第一个标识是否为选择关键字,以根据第一个标识的情况对抽象语法树进行拆分。具体地,根据union子句中的union关键字的情况对AST进行拆分包括:在union子句中不包括union关键字的情况下,获取union后的第一个select关键字,并将第一个select关键字及其之后的所有Token组合为select子句。在将第一个select关键字及其之后的所有Token组合为select子句之后,判断select子句中的第一个Token是否为select关键字,从而根据第一个Token的情况对AST进行进一步地拆分。
在一个实施例中,第一关键字为联合查询关键字,根据第二类型子句中包括第一关键字的情况对抽象语法树进行拆分包括:在第二类型子句中包括联合查询关键字的情况下,判断第二类型子句后的第一个选择关键字是否位于第一个联合查询关键字之前。具体地,根据DDL/DML子句中的union关键字的情况对AST进行拆分包括:在DDL/DML子句中包括union关键字的情况下,判断DDL/DML子句后的第一个select关键字是否位于第一个union关键字之前。在第二类型子句后的第一个选择关键字位于第一个联合查询关键字之前的情况下,将第一个选择关键字与第一个联合查询关键字之间的标识组合为第一个联合查询子句。具体地,当第一个select关键字位于第一个union关键字之前的情况下,将第一个select关键字与第一个union关键字之间的所有Token组合为第一个union子句。在第二类型子句后的第一个选择关键字位于第一个联合查询关键字之后的情况下,将第一个联合查询关键字之前的第一个标识符或子查询确定为第一个联合查询子句,并将位于每个联合查询关键字之间以及最后一个联合查询关键字之后的标识确定为其他的联合查询子句。具体地,当第一个select关键字位于第一个union关键字之后的情况下,将第一个union关键字之前的第一个标识符或子查询作为第一个union子句,并将每个union关键字之间以及最后一个union关键字之后的所有Token作为剩余的union子句。将第一个联合查询子句和其他的联合查询子句均转换为以选择关键字为开头的第三选择子句,并将第二血缘数据目标表确定为第二选择子句的第四血缘数据目标表。判断第三选择子句中的第一个标识是否为选择关键字,以根据第一个标识的情况对抽象语法树进行拆分。具体地,将第一个union子句和剩余的union子句都转换为select开头的select子句,并将DDL或DML子句后出现的第一个标识符也作为该段血缘的目标表。并判断select子句中的第一个Token是否为select关键字,从而根据第一个Token的情况对AST进行进一步地拆分。
在一个实施例中,在第二类型子句中不包括联合查询关键字的情况下,获取第二类型子句后的第一个选择关键字。将第二类型子句后的第一个选择关键字与第二类型子句后的第一个选择关键字之后的标识列表确定为第四选择子句。判断第四选择子句中的第一个标识是否为选择关键字,以根据第一个标识的情况对抽象语法树进行拆分。具体地,根据DDL/DML子句中的union关键字的情况对AST进行拆分包括:在DDL/DML子句中不包括union关键字的情况下,获取union后的第一个select关键字,并将第一个select关键字及其之后的所有Token组合为select子句。在将第一个select关键字及其之后的所有Token组合为select子句之后,判断select子句中的第一个Token是否为select关键字,从而根据第一个Token的情况对AST进行进一步地拆分。
在一个实施例中,根据选择子句中的第一个标识的情况对抽象语法树进行拆分包括:在第一个标识是选择关键字的情况下,将位于选择关键字与第二关键字之间的子句确定为字段域子句,并获取字段域子句中包含的第二标识符。判断第二关键字之后的标识列表是否包括第三关键字,在第二关键字之后的标识列表包括第三关键字的情况下,将位于第二关键字与第三关键字之间的子句确定为等值连接子句,在第二关键字之后的标识列表不包括第三关键字的情况下,将位于第二关键字之后的标识符确定为表检索子句。具体地,图3b提供了解析抽象语法树的另一流程图。如图3b所示,判断select子句中的第一个Token是否为select关键字,从而根据第一个Token的情况对AST进行进一步地拆分包括:在select子句中的第一个Token为select关键字的情况下,找出select关键字后的from关键字,将位于select关键字与from关键字之间的子句作为select_from子句,并获取select_from子句中包含的标识符。在获取select_from子句中包含的标识符之后,判断from关键字之后的Token列表是否包括join关键字,在from关键字之后的Token列表包括join关键字的情况下,将from关键字与join关键字之间的子句作为join子句。在from关键字之后的Token列表不包括join关键字的情况下,将位于from关键字之后的标识符作为from子句。
进一步地,在第一个标识不是选择关键字的情况下,确定抽象语法树的第一层级拆分完毕,根据字段域子句确定结构化查询语言脚本的血缘数据。具体地,在select子句中的第一个Token不是select关键字的情况下,确定AST的第一个层级已经拆分完毕,则根据select_from子句确定SQL脚本的血缘数据。
在一个实施例中,血缘数据包括列级血缘数据,根据字段域子句确定结构化查询语言脚本的血缘数据包括:判断字段域子句中的标识符是否存在别名,在字段域子句中的标识符存在别名的情况下,将存在别名的标识符的当前位置和别名与第一血缘数据目标表、第二血缘数据目标表、第三血缘数据目标表以及第四血缘数据目标表中的任意一者组合为列级血缘的右列。在字段域子句中的标识符不存在别名的情况下,将字段域子句中的标识符的字段名与第一血缘数据目标表、第二血缘数据目标表、第三血缘数据目标表以及第四血缘数据目标表中的任意一者组合为列级血缘的右列。根据字段域子句中的标识符的第一个标识的类型确定列级血缘的左列,将列级血缘的右列与列级血缘的左列进行组合,以得到列级血缘数据。具体地,如图3b所示,根据select_from子句确定SQL脚本的血缘数据包括:判断select_from子句中的标识符是否存在别名,在select_from子句中的标识符存在别名的情况下,将存在别名的标识符的当前位置、别名与任意一个血缘数据目标表进行组合,组合为列级血缘的右列。对于不存在别名的标识符,将select_from子句中的标识符的字段名与任意一个血缘数据目标表进行组合,组合为列级血缘的左列。并将组合得到的左列和右列进行组合,以得到列级血缘的完整数据。
在一个实施例中,如图3b所示,提供了解析抽象语法树的另一流程图。在第二关键字之后的标识列表不包括第三关键字的情况下,将位于第二关键字之后的标识符确定为表检索子句,并确定抽象语法树的第一层级拆分完毕。此时,根据等值连接子句和表检索子句确定结构化查询语言脚本的血缘数据。具体地,在from关键字之后的Token列表不包括join关键字的情况下,将位于from关键字之后的标识符作为from子句,并确定AST第一层级已经拆分完毕。血缘数据包括表级血缘数据,根据等值连接子句和表检索子句确定结构化查询语言脚本的血缘数据包括:获取等值连接子句与表检索子句中每个标识符的数据库名和表名,将数据库名和表名组合为表级血缘的左列,将左列与第一血缘数据目标表、第二血缘数据目标表、第三血缘数据目标表以及第四血缘数据目标表中的任意一者进行组合,以得到表级血缘数据。具体地,根据join子句与from子句确定SQL脚本的血缘数据包括:针对join子句与from子句中的每个标识符,获取每个标识符的数据库名和表名,并将数据库名和表名进行组合,组合为表级血缘数据的左列,将左列与任意一个血缘数据目标表进行组合以得到完整的表级血缘数据。
在一个实施例中,如图3c所示,提供了解析抽象语法树的又一流程图。判断等值连接子句与表检索子句中的标识符的第一个标识是否为子查询,在等值连接子句与表检索子句中的标识符的第一个标识是子查询的情况下,对抽象语法树的第二层级进行解析。在等值连接子句与表检索子句中的标识符的第一个标识不是子查询的情况下,确定抽象语法树拆分完毕。具体地,判断join子句与from子句中的标识符的第一个Token是否为子查询,若第一个Token为子查询,则对AST的第二层级进行解析,若第一个Token不是子查询,则确定AST的所有层级均已拆分完毕。
进一步地,若第一个Token为子查询,则对AST的第二层级进行解析,对AST的第二层级进行解析包括:获取join子句与from子句中的标识符的别名,并将该类标识符的别名确定为AST的第一层的血缘数据目标表,并将子查询内的SQL确定为union子句。并根据union子句中的第一个Token的情况对AST的第二层级进行解析。
在一个实施例中,在字段域子句中的标识符不存在别名的情况下,根据字段域子句中的标识符的第一个标识的类型确定列级血缘的左列。即在select_from子句中的标识符不存在别名的情况下,根据select_from子句中的标识符的第一个Token的类型确定列级血缘的左列包括:当第一个token为子查询时,拆分子查询为算子函数、标识符、子查询等。当第一个token为算子时,拆分算子为函数、标识符、子查询等。当第一个token为函数时,获取函数参数内的所有字段标识符,组合标识符的库名、表名、字段名作为左列。当第一个token为标识符或*时,组合标识符的库名、表名、字段名作为左列。当第一个token为比较运算时,根据比较运算符拆分为左右两部分(可能为算子函数、标识符、子查询)。当第一个token为Case时,则拆分case为子查询、算子、函数、标识符、比较运算。
在一个实施例中,如若在处理列级血缘获取时出现以下两种特殊情况:
第一种:当SQL语句中包含union时,第一个union关键字之后的字段血缘的目标列信息以第一个select子句的目标列为准;例如:SQL语句:insert into tableA selectcol1 as col1,col2 as col2 from tableB union select col3,col4from tableC。如果不进行特殊处理,得到的血缘数据为:tableB.col1->tableA.col1,tableB.col2->tableA.col2,tableC.col3->tableA.col3,tableC.col4->tableA.col4。观察血缘数据的右列可知,tableA的字段有col1、col2、col3、col4。但实际上通过SQL语义可知tableA的字段只有col1、col2,所以在处理select col3,col4 from tableC的血缘时,我们会将SQL语句理解为insert into tableA select col3 as col1,col4 as col2 from tableC。这样得到的血缘数据为:tableB.col1->tableA.col1,tableB.col2->tableA.col2,tableC.col3->tableA.col1,tableC.col4->tableA.col1。
第二种:对于SQL语句中使用了*,from关键字后存在多表的情况,默认*只会取from后的第一个表,而不是所有的。比如:insert into tableA select*from tableB,tableC,在SQL语句中*指代不明,应避免SQL语句中包含此类情况;在处理时,我们会将SQL理解为insert into tableA select tableB.*from tableB,tableC,获得的血缘数据为tableB.*->tableA.*。
在一个实施例中,通过抽象语法树解析获取的血缘数据可分为两部分,一部分是包含*的列级血缘数据,本部分血缘数据仍需进一步处理,另一部分是不包含*的血缘数据(无需处理)。本方案的第二个创新点是使用脚本内血缘的上下文信息,以及数据表的元数据信息,处理SQL脚本(血缘数据)中有*的情况。
针对列级血缘数据中有*的,区分血缘数据中的数据表,根据SQL脚本中表是否落地和表的使用范围将表分为:实体表、临时表、虚表。实体表:数据会在数据库落地且所有脚本均能使用;临时表:数据会在数据库落地(或数据会缓存到内存),只能在当前脚本内使用;虚表:数据不会落地,通常指代一段SQL语句生成或为SQL语句中的别名。例如SQL:insert into tableB(column2)select tableA.column1 from(select*from tableC)tableA,tableA为虚表,tableB和tableC可为实体表或临时表(可根据table的命名规范来区分实体表和临时表,通常tmp.tableB则tableB为临时表,adl.tableC则tableC为实体表)。
左列为*且右列为*的数据,依据上述分类可分为以下9种情况:左列为临时表:临时表按照先建立后使用的原则。
情况1,左表为临时表右表为临时表(create table tmp.tableA select*fromtmp.tableB)。对于tmp.tableB的字段信息,按照临时表先建立后使用的原则,在当前SQL脚本之前一定会存在如下类似SQL:create table tmp.tableB select col1,col3 fromtmp.tableC,可得血缘tmp.tableC.col1->tmp.tableB.col1,根据这条血缘数据,tmp.tableB只有一个字段列col1,那么tmp.tableA也只有一个字段列col1,tmp.tableB.col1->tmp.tableA.col1,tmp.tableB.col3->tmp.tableA.col3。
情况2,左表为临时表右表为实体表(insert into db.tableA select*fromtmp.tableB)。同上db.tableA也只有一个字段列,但字段名需查询db.tableA的元数据获取,假定为col2,则血缘数据为tmp.tableB.col1->db.tableA.col2。
情况3,左表为临时表右表为虚表(with v_table as select*from tmp.tableB)。同情况1),因右表为虚表无固定表结构和字段,其字段由左表tmp.tableB决定,即只有字段col1,则血缘数据为tmp.tableB.col1-><default>.v_table.col1。左表为实体表时,可通过查询实体表的元数据信息(至少包含数据库名、表名、字段名、字段排序等信息),不管是关系型数据库(如MYSQL或ORACLE)还是数据仓库(如HIVE)都有表可查询元数据信息。假定db.tableB的元数据信息如表(1):
数据库名 | 表名 | 字段名 | 字段排序 |
db | tableB | col1 | 1 |
db | tableB | col2 | 2 |
表(1)
情况4,左表为实体表右表为临时表(create table tmp.tableA select*fromdb.table)。因tmp.tableA为新创建,其字段由db.tableB决定,所以血缘数据为db.tableB.col1->tmp.tableA.col1,db.tableB.col2->tmp.tableA.col2。
情况5,左表为实体表右表为实体表(insert into db.tableC select*fromdb.tableB)。因db.tableC为实体表,其字段在元数据已定义,假定tableC的元数据如下表(2):
数据库名 | 表名 | 字段名 | 字段排序 |
db | tableC | col5 | 1 |
db | tableC | col4 | 2 |
表(2)
所以,依据元数据,SQL可翻译为:insert into db.tableC(col5,col6)selectcol1,col2 from db.tableB,所以可得血缘数据,db.tableB.col1->db.tableC.col5,db.tableB.col2->db.tableC.col4。
情况6,左表为实体表右表为虚表(with v_tableD as select*from db.tableB)。因v_tableD为虚表,其字段由db.tableB决定,所以血缘数据为
db.tableB.col1-><default>.v_tableD.col1,db.tableB.col2-><default>.v_tableD.col2。左表为虚表,虚表是作为实体表或临时表之间的一个中间变量,虚表最终来源为实体表或临时表。
情况7,左表为虚表右表为临时表(create table tmp.tableA select a.*from(select col1 from db.tableB)a)。上述SQL中血缘关系为<default>.a.*->tmp.tableA.*与db.tableB.col1-><default>.a.col1,<default>.a.*的血缘信息可通过已有血缘的字段信息获取。比如<default>.a只有字段col1。则完整的血缘关系为<default>.a.col1->tmp.tableA.col1与db.tableB.col1-><default>.a.col1。
情况8,左表为虚表右表为实体表(insert into db.tableA select a.*from(select col1 from db.tableB)a)。上述SQL中血缘关系为<default>.a.*->db.tableA.*与db.tableB.col1-><default>.a.col1,<default>.a.*的血缘信息可通过已有血缘的字段信息获取。db.tableA的字段信息可通过元数据获取,假定有一个字段col3,则完整的血缘关系为<default>.a.col1->db.tableA.col3与db.tableB.col1-><default>.a.col1。
情况9,左表为虚表右表为虚表(insert into db.tableA select b.*from(select a.*from(select col1 from db.tableB)a)b)。上述SQL中血缘关系为<default>.b.*->db.tableA.*、db.tableB.col1-><default>.a.col1、<default>.a.*-><default>.b.*。对于<default>.a.*-><default>.b.*,<default>.a.*的血缘信息可通过已有血缘的字段信息获取。<default>.b.*为虚表,其字段内容由<default>.a决定。则完整的血缘关系为<default>.b.col1->db.tableA.col1、db.tableB.col1-><default>.a.col1、<default>.a.col1-><default>.b.col1。
本方案提出了一种数据血缘离线解析方法,通过将SQL脚本划分为不同的子语句,使得数据血缘由链式变为分段式,分段式解析保证了血缘数据只会出现左右两列同时为*的情况。同时,本技术方案使用元数据和血缘数据的上下文处理了左右两列同时为*的情况,用以获取完整的血缘数据。本方案的离线解析方法,无需实际运行SQL语句,相比数据血缘在线解析大大地提高了解析效率。
本申请实施例提供了一种存储介质,其上存储有程序,该程序被处理器执行时实现上述用于数据血缘的解析方法。
本申请实施例提供了一种处理器,所述处理器用于运行程序,其中,所述程序运行时执行上述用于数据血缘的解析方法。
在一个实施例中,提供了一种计算机设备,该计算机设备可以是服务器,其内部结构图可以如图4所示。该计算机设备包括通过系统总线连接的处理器A01、网络接口A02、存储器(图中未示出)和数据库(图中未示出)。其中,该计算机设备的处理器A01用于提供计算和控制能力。该计算机设备的存储器包括内存储器A03和非易失性存储介质A04。该非易失性存储介质A04存储有操作系统B01、计算机程序B02和数据库(图中未示出)。该内存储器A03为非易失性存储介质A04中的操作系统B01和计算机程序B02的运行提供环境。该计算机设备的数据库用于存储用于数据血缘的解析数据。该计算机设备的网络接口A02用于与外部的终端通过网络连接通信。该计算机程序B02被处理器A01执行时以实现一种用于数据血缘的解析方法。
本领域技术人员可以理解,图4中示出的结构,仅仅是与本申请方案相关的部分结构的框图,并不构成对本申请方案所应用于其上的计算机设备的限定,具体的计算机设备可以包括比图中所示更多或更少的部件,或者组合某些部件,或者具有不同的部件布置。
本申请实施例提供了一种设备,设备包括处理器、存储器及存储在存储器上并可在处理器上运行的程序,处理器执行程序时实现用于数据血缘的解析方法。
本申请还提供了一种计算机程序产品,当在数据处理设备上执行时,适于执行初始化用于数据血缘的解析方法。
本领域内的技术人员应明白,本申请的实施例可提供为方法、系统、或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本申请是参照根据本申请实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
在一个典型的配置中,计算设备包括一个或多个处理器(CPU)、输入/输出接口、网络接口和内存。
存储器可能包括计算机可读介质中的非永久性存储器,随机存取存储器(RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(flash RAM)。存储器是计算机可读介质的示例。
计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、商品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、商品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括要素的过程、方法、商品或者设备中还存在另外的相同要素。
以上仅为本申请的实施例而已,并不用于限制本申请。对于本领域技术人员来说,本申请可以有各种更改和变化。凡在本申请的精神和原理之内所作的任何修改、等同替换、改进等,均应包含在本申请的权利要求范围之内。
Claims (16)
1.一种用于数据血缘的解析方法,其特征在于,所述解析方法包括:
获取待解析的结构化查询语言脚本,所述结构化查询语言脚本至少包括一个结构化查询语句;
对所述结构化查询语言脚本进行解析,以生成与所述结构化查询脚本对应的抽象语法树,其中,所述抽象语法树包括不同类型的标识和标识列表;
采用分段式搜索方式拆分所述抽象语法树,以得到所述抽象语法树的多个子语句;
根据所述多个子语句确定所述抽象语法树包含的血缘数据目标表和标识符;
在所述抽象语法树拆分完毕的情况下,根据所述血缘数据目标表和所述标识符对所述抽象语法树进行解析以得到所述结构化查询语言脚本的血缘数据。
2.根据权利要求1所述的用于数据血缘的解析方法,其特征在于,所述标识至少包括第一类型关键字、第二类型关键字、第一关键字、第二关键字以及第三关键字,所述采用分段式搜索方式拆分所述抽象语法树,以得到所述抽象语法树的多个子语句包括:
判断所述抽象语法树的第一个层级的标识是否为所述第一类型关键字;
在所述第一个层级的标识是所述第一类型关键字的情况下,将所述抽象语法树拆分为所述第一类型子句和所述第二类型子句,其中,所述第一类型子句是由第一字节和第二字节构成的子句;
将所述第一类型子句中位于所述第一字节之后的部分确定为第一标识符,并根据所述第一标识符确定所述第一类型子句的第一血缘数据目标表,并将所述第一类型子句中位于所述第二字节之后的子查询内的结构化查询语句确定为第一联合查询子句;
根据所述第一联合查询子句中包括第一关键字的情况对所述抽象语法树进行拆分。
3.根据权利要求2所述的用于数据血缘的解析方法,其特征在于,所述解析方法还包括:
在所述第一个层级的标识不是所述第一类型关键字的情况下,确定所述第一个层级的标识为第二类型关键字;
将所述第二类型子句之后出现的第一个标识符确定为所述第二类型子句的第二血缘数据目标表;
根据所述第二类型子句中包括第一关键字的情况对所述抽象语法树进行拆分。
4.根据权利要求2所述的用于数据血缘的解析方法,其特征在于,所述第一关键字为联合查询关键字,所述根据所述第一联合查询子句中包括第一关键字的情况对所述抽象语法树进行拆分包括:
在所述第一联合查询子句中包括所述联合查询关键字的情况下,判断所述第一联合查询子句后的第一个选择关键字是否位于所述第一个联合查询关键字之前;
在所述第一联合查询子句后的第一个选择关键字位于所述第一个联合查询关键字之前的情况下,将所述第一个选择关键字与所述第一个联合查询关键字之间的标识组合为第一个联合查询子句;
在所述第一联合查询子句后的第一个选择关键字位于所述第一个联合查询关键字之后的情况下,将所述第一个联合查询关键字之前的第一个标识符或子查询确定为第一个联合查询子句,并将每个联合查询关键字之间以及最后一个联合查询关键字之后的标识确定为其他的联合查询子句;
将所述第一个联合查询子句和所述其他的联合查询子句均转换为以选择关键字为开头的第一选择子句,并将所述第一血缘数据目标表确定为所述第一选择子句的第三血缘数据目标表;
判断所述第一选择子句中第一个标识是否为选择关键字,以根据所述第一个标识的情况对所述抽象语法树进行拆分。
5.根据权利要求4所述的用于数据血缘的解析方法,其特征在于,所述解析方法还包括:
在所述第一联合查询子句中不包括联合查询关键字的情况下,获取所述第一联合查询子句后的第一个选择关键字;
将所述第一联合查询子句后的第一个选择关键字与所述第一联合查询子句后的第一个选择关键字之后的标识列表确定为第二选择子句;
判断所述第二选择子句中的第一个标识是否为选择关键字,以根据所述第一个标识的情况对所述抽象语法树进行拆分。
6.根据权利要求3所述的用于数据血缘的解析方法,其特征在于,所述第一关键字为联合查询关键字,所述根据所述第二类型子句中包括第一关键字的情况对所述抽象语法树进行拆分包括:
在所述第二类型子句中包括所述联合查询关键字的情况下,判断所述第二类型子句后的第一个选择关键字是否位于所述第一个联合查询关键字之前;
在所述第二类型子句后的第一个选择关键字位于所述第一个联合查询关键字之前的情况下,将所述第一个选择关键字与所述第一个联合查询关键字之间的标识组合为第一个联合查询子句;
在所述第二类型子句后的第一个选择关键字位于所述第一个联合查询关键字之后的情况下,将所述第一个联合查询关键字之前的第一个标识符或子查询确定为第一个联合查询子句,并将位于每个联合查询关键字之间以及最后一个联合查询关键字之后的标识确定为其他的联合查询子句;
将所述第一个联合查询子句和所述其他的联合查询子句均转换为以选择关键字为开头的第三选择子句,并将所述第二血缘数据目标表确定为所述第二选择子句的第四血缘数据目标表;
判断所述第三选择子句中的第一个标识是否为选择关键字,以根据所述第一个标识的情况对所述抽象语法树进行拆分。
7.根据权利要求6所述的用于数据血缘的解析方法,其特征在于,所述解析方法还包括:
在所述第二类型子句中不包括联合查询关键字的情况下,获取所述第二类型子句后的第一个选择关键字;
将所述第二类型子句后的第一个选择关键字与所述第二类型子句后的第一个选择关键字之后的标识列表确定为第四选择子句;
判断所述第四选择子句中的第一个标识是否为选择关键字,以根据所述第一个标识的情况对所述抽象语法树进行拆分。
8.根据权利要求4、5、6以及7中任意一项所述的用于数据血缘的解析方法,其特征在于,根据所述第一个标识的情况对所述抽象语法树进行拆分包括:
在所述第一个标识是选择关键字的情况下,将位于所述选择关键字与所述第二关键字之间的子句确定为字段域子句,并获取所述字段域子句中包含的第二标识符;
判断所述第二关键字之后的标识列表是否包括第三关键字;
在所述第二关键字之后的标识列表包括第三关键字的情况下,将位于所述第二关键字与所述第三关键字之间的子句确定为等值连接子句;
在所述第二关键字之后的标识列表不包括第三关键字的情况下,将位于所述第二关键字之后的标识符确定为表检索子句。
9.根据权利要求8所述的用于数据血缘的解析方法,其特征在于,所述解析方法还包括:
在所述第一个标识不是选择关键字的情况下,确定所述抽象语法树的第一层级拆分完毕;
根据所述字段域子句确定所述结构化查询语言脚本的血缘数据。
10.根据权利要求9所述的用于数据血缘的解析方法,其特征在于,所述血缘数据包括列级血缘数据,所述根据所述字段域子句确定所述结构化查询语言脚本的血缘数据包括:
判断所述字段域子句中的标识符是否存在别名;
在所述字段域子句中的标识符存在别名的情况下,将存在别名的标识符的当前位置和别名与所述第一血缘数据目标表、所述第二血缘数据目标表、所述第三血缘数据目标表以及所述第四血缘数据目标表中的任意一者组合为列级血缘的右列;
在所述字段域子句中的标识符不存在别名的情况下,将所述字段域子句中的标识符的字段名与所述第一血缘数据目标表、所述第二血缘数据目标表、所述第三血缘数据目标表以及所述第四血缘数据目标表中的任意一者组合为所述列级血缘的右列;
根据所述字段域子句中的标识符的第一个标识的类型确定所述列级血缘的左列;
将所述列级血缘的右列与所述列级血缘的左列进行组合,以得到所述列级血缘数据。
11.根据权利要求8所述的用于数据血缘的解析方法,其特征在于,在所述抽象语法树的第一层级拆分完毕之后,根据所述等值连接子句和所述表检索子句确定所述结构化查询语言脚本的血缘数据。
12.根据权利要求10所述的用于数据血缘的解析方法,其特征在于,所述血缘数据包括表级血缘数据,所述根据所述等值连接子句和所述表检索子句确定所述结构化查询语言脚本的血缘数据包括:
获取所述等值连接子句与所述表检索子句中每个标识符的数据库名和表名;
将所述数据库名和所述表名组合为表级血缘的左列;
将所述左列与所述第一血缘数据目标表、所述第二血缘数据目标表、所述第三血缘数据目标表以及所述第四血缘数据目标表中的任意一者进行组合,以得到所述表级血缘数据。
13.根据权利要求12所述的用于数据血缘的解析方法,其特征在于,所述解析方法还包括:
判断所述等值连接子句与所述表检索子句中的标识符的第一个标识是否为子查询;
在所述等值连接子句与所述表检索子句中的标识符的第一个标识是子查询的情况下,对所述抽象语法树的第二层级进行解析;
在所述等值连接子句与所述表检索子句中的标识符的第一个标识不是子查询的情况下,确定所述抽象语法树拆分完毕。
14.根据权利要求13所述的用于数据血缘的解析方法,其特征在于,对所述抽象语法树存在第二层级进行解析包括:
获取所述子查询中的标识符的别名;
将所述子查询中的标识符的别名确定为所述抽象语法树的第一层的血缘数据目标表,并将所述子查询内的结构化查询语句确定为第二联合查询子句;
并根据所述第二联合查询子句中的第一个标识的情况对所述抽象语法树存在第二层级进行解析。
15.一种处理器,其特征在于,被配置成执行根据权利要求1至14中任意一项所述的用于数据血缘的解析方法。
16.一种机器可读存储介质,该机器可读存储介质上存储有指令,其特征在于,该指令在被处理器执行时使得所述处理器被配置成执行根据权利要求1至14中任一项所述的用于数据血缘的解析方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202310436495.1A CN116662367A (zh) | 2023-04-21 | 2023-04-21 | 用于数据血缘的解析方法、存储介质及处理器 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202310436495.1A CN116662367A (zh) | 2023-04-21 | 2023-04-21 | 用于数据血缘的解析方法、存储介质及处理器 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN116662367A true CN116662367A (zh) | 2023-08-29 |
Family
ID=87712590
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202310436495.1A Pending CN116662367A (zh) | 2023-04-21 | 2023-04-21 | 用于数据血缘的解析方法、存储介质及处理器 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN116662367A (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN117370620A (zh) * | 2023-12-08 | 2024-01-09 | 广东航宇卫星科技有限公司 | 一种数据血缘的构建方法、装置、终端设备及存储介质 |
-
2023
- 2023-04-21 CN CN202310436495.1A patent/CN116662367A/zh active Pending
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN117370620A (zh) * | 2023-12-08 | 2024-01-09 | 广东航宇卫星科技有限公司 | 一种数据血缘的构建方法、装置、终端设备及存储介质 |
CN117370620B (zh) * | 2023-12-08 | 2024-04-05 | 广东航宇卫星科技有限公司 | 一种数据血缘的构建方法、装置、终端设备及存储介质 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN111522816B (zh) | 基于数据库引擎的数据处理方法、装置、终端及介质 | |
CN110908997B (zh) | 数据血缘构建方法、装置、服务器及可读存储介质 | |
CN112347123B (zh) | 数据血缘的分析方法、装置和服务器 | |
US9355152B2 (en) | Non-exclusionary search within in-memory databases | |
US20200073863A1 (en) | System and method for facilitating efficient indexing in a database system | |
US9959326B2 (en) | Annotating schema elements based on associating data instances with knowledge base entities | |
US11126656B2 (en) | Formatting semi-structured data in a database | |
CN116662367A (zh) | 用于数据血缘的解析方法、存储介质及处理器 | |
CN111562920A (zh) | 小程序代码相似度确定方法、装置、服务器及存储介质 | |
US20080195610A1 (en) | Adaptive query expression builder for an on-demand data service | |
CN114116767A (zh) | 数据库sql查询语句转换方法及装置 | |
CN111125216B (zh) | 数据导入Phoenix的方法及装置 | |
CN111078728B (zh) | 一种数据库归档模式下跨库查询方法和装置 | |
CN117290377A (zh) | 一种关系型数据库间sql语句的转换方法以及装置 | |
CN110968555B (zh) | 维度数据处理方法和装置 | |
US20170242880A1 (en) | B-tree index structure with grouped index leaf pages and computer-implemented method for modifying the same | |
Liu et al. | PAIRPQ: an efficient path index for regular path queries on knowledge graphs | |
US10318507B2 (en) | Optimizing tables with too many columns in a database | |
US12086161B2 (en) | Transforming relational statements into hierarchical data space operations | |
CN110147396B (zh) | 一种映射关系生成方法及装置 | |
CN115292347A (zh) | 一种基于规则的主动式sql算法性能检查装置及方法 | |
KR102215263B1 (ko) | Sql 쿼리의 유형을 분류하는 방법, 이상 상황 발생 여부 결정 방법 및 컴퓨팅 디바이스 | |
US8136064B2 (en) | Bijectively mapping character string to integer values in integrated circuit design data | |
Faust et al. | Footprint reduction and uniqueness enforcement with hash indices in SAP HANA | |
Mershad et al. | COACT: a query interface language for collaborative databases |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |