本发明涉及数据库,尤其是涉及一种基于非校验的异构数据库数据血缘解析方法。
背景技术:
1、数据处理逻辑的日趋复杂,催生了数据溯源、影响性分析和数据体系优化等需求,而这些需求都指向了数据血缘这一技术。以sql脚本为主的数据处理系统,获取数据血缘最好的方法就是解析sql语句来获取血缘。目前行业现有的基于sql的数据血缘解析方案通常依赖于数据治理系统或数据开发系统,再或者基于一种或几种数据库方言进行sql血缘解析。数据治理系统和开发工具的sql血缘解析主要有基于集成系统的方案、基于语法树的方案和人工方案。
2、基于集成系统的方案以阿里的data-works和字节跳动data-leap为代表,二者都是集成在数据治理系统或数据开发系统内的方案。开发人员使用集成系统编写sql的同时,可以通过图形化界面选择输入输出表,使用数据治理系统中注册的表元数据,并结合sql语法解析,可以自动的完成sql血缘的构建。该方案的优点是整个过程开发人员无感,生成sql血缘准确。缺点首先是其依赖于数据治理系统和数据开发系统的构建,对于基于集成系统开发的sql可以解析出血缘,但对于独立于集成系统外的脚本,如数据治理系统构建前就已经存在的存量脚本无能为力。
3、基于语法树的方案以交通银行较早的解析方案为代表,使用了druid或其他工具通过构建语法树解析sql以获得血缘。这类的方案优点是获取的sql语法结构准确,有利于正确提取血缘。其次,其可以独立于集成系统运行,能够解析存量脚本。这类方案的缺点在于获取语法树虽然简单,但编写能在语法树上获取血缘的遍历规则较难,复杂sql的语法树往往比较复杂,实际过程中,从复杂语法树的多层结构上获取血缘所应对的情况较多,开发困难。另外,不同数据库方言不同,匹配血缘规则需要重新开发。
技术实现思路
1、本发明的目的就是为了克服上述现有技术存在的缺陷而提供了一种准确性高、适用性高的基于非校验的异构数据库数据血缘解析方法。
2、本发明的目的可以通过以下技术方案来实现:
3、一种基于非校验的异构数据库数据血缘解析方法,该方法包括:
4、读取sql脚本;
5、预处理:对sql脚本进行格式替换,转换为供词法分析使用的sql字符串;
6、词法分析:采用python的sqlparse模块对sql字符串进行词法分析,将脚本字符串切分成多个语句,并生成对应的token列表;
7、原子血缘解析:基于原子血缘解析sqllineage模块对所述token列表进行扫描,根据扫描到的关键字在源和目标两个状态之间切换,匹配相应的源与目标的记录生成从源到目标的血缘。
8、优选地,所述对sql脚本进行格式替换,包括:
9、脚本变量替换:基于正则表达式替换逻辑,将脚本变量归为常量表下的同名变量,所述常量表默认为常量和脚本变量的集合;
10、脚本常量替换:将脚本常量转换为常量表下的默认值;
11、非血缘函数替换:将create语句转换为insert语句。
12、优选地,所述脚本常量包括空串、字符串常量和非字符串常量。
13、优选地,所述对sql脚本进行格式替换,还包括:
14、merge语句替换:将merge语句替换为1个或2个insert语句;
15、以及头部注释信息提取。
16、优选地,所述原子血缘解析sqllineage模块,还包括:对于insert型的sql语句,通过共享源与目标状态,将col信息传递给目标状态,以进行源字段与目标字段的匹配。
17、优选地,所述原子血缘解析sqllineage模块,还包括:将union类操作拆成两段独立逻辑,以进行union解析。
18、优选地,所述方法还包括对原子血缘解析sqllineage模块的输出进行图处理,包括:将每个子查询过程中原子血缘解析生成的血缘边转换为节点和边,将同一语句的各个子查询的边连接成该sql语句的血缘图,再将整个sql脚本中多个sql语句的多张血缘图合并为一张脚本血缘图。
19、优选地,在生成脚本血缘图后,还包括:
20、将脚本血缘图中的边信息持久化到文件和数据库;
21、在持久化过程中使用pandas库,将解析保存成excel文件格式并持久化到硬盘中;
22、持久化后的数据经过字符分割后转化成dat文件,再通过数据库导入操作保存到数据库中。
23、优选地,所述读取sql脚本,具体为:
24、使用python的paramiko模块进行sftp下载;
25、从ini格式的配置文件中读取数据中台脚本的地址,使用sftp连接地址对应的etl服务器,下载指定脚本开发命名规范的sql脚本。
26、优选地,所述方法还包括:使用python的logging模块对血缘解析各个步骤进行分级记录。
27、与现有技术相比,本发明具有以下有益效果:
28、1)本发明设计的基于非校验的异构数据库sql血缘解析方法,可以有效解决异构数据库上sql的血缘获取问题,得到的血缘链路完整性高。可以独立于数据治理系统和数据开发系统运行,且不依赖于sql语法树,仅针对血缘这一单一场景构建,解析效率更高,不需要对每一种语法结构进行适配。可以大幅提高业务人员和技术人员在进行数据溯源、影响性分析和数据体系优化等工作的效率。
29、2)本发明在进行词法分析前,对sql脚本进行格式替换,将其转换为供词法分析使用的sql字符串,可替换一些不能被总控程序识别的语句,可获得更准确的血缘。
30、3)本发明对sql脚本进行格式替换时,通过merge替换和头部注释信息提取,通过不同数据库添加不同的替换规则,各个项目组可针对自己的sql脚本规范自定义添加规则,实现了可定制化的sql脚本预处理,进一步提升了后续词法分析、原子血缘解析的准确性。
31、4)本发明采用python的sqlparse模块对sql脚本字符串进行词法分析,选用的sqlparse模块为非校验型词法分析器,在词法解析时不校验语句是否在词法方面严谨,只是单纯地匹配关键字和括号,括号匹配采取非严格方式,因此可以最大限度兼容不同数据库的不同方言,即不依赖于具体的数据库方言实现,能够覆盖大多数数据库系统。
32、5)本发明基于原子血缘解析sqllineage模块对token列表进行不往返扫描token列表扫描,根据扫描到的关键字在源和目标两个状态之间切换,匹配相应的源与目标的记录生成从源到目标的血缘,血缘解析场景的效率和兼容性都极高。
33、6)本发明在对原子血缘解析sqllineage模块进行改进,包括:对于insert(col..)型的sql语句,通过共享源与目标状态,将col信息传递给目标状态,可实现源字段与目标字段的匹配;对于union类操作,sqllineage存在错配的问题,通过将union拆成两段独立逻辑,使得union能够正确解析。
34、7)本方法还兼容自循环血缘,即源与目标是同表,多输出脚本,多语句脚本等情况,且对于开发规范只有很少的限制,而且开发成本和学习成本都较低,经济实用。
1.一种基于非校验的异构数据库数据血缘解析方法,其特征在于,该方法包括:
2.根据权利要求1所述的一种基于非校验的异构数据库数据血缘解析方法,其特征在于,所述对sql脚本进行格式替换,包括:
3.根据权利要求2所述的一种基于非校验的异构数据库数据血缘解析方法,其特征在于,所述脚本常量包括空串、字符串常量和非字符串常量。
4.根据权利要求1所述的一种基于非校验的异构数据库数据血缘解析方法,其特征在于,所述对sql脚本进行格式替换,还包括:
5.根据权利要求1所述的一种基于非校验的异构数据库数据血缘解析方法,其特征在于,所述原子血缘解析sqllineage模块,还包括:对于insert型的sql语句,通过共享源与目标状态,将col信息传递给目标状态,以进行源字段与目标字段的匹配。
6.根据权利要求1所述的一种基于非校验的异构数据库数据血缘解析方法,其特征在于,所述原子血缘解析sqllineage模块,还包括:将union类操作拆成两段独立逻辑,以进行union解析。
7.根据权利要求1所述的一种基于非校验的异构数据库数据血缘解析方法,其特征在于,所述方法还包括对原子血缘解析sqllineage模块的输出进行图处理,包括:将每个子查询过程中原子血缘解析生成的血缘边转换为节点和边,将同一语句的各个子查询的边连接成该sql语句的血缘图,再将整个sql脚本中多个sql语句的多张血缘图合并为一张脚本血缘图。
8.根据权利要求7所述的一种基于非校验的异构数据库数据血缘解析方法,其特征在于,在生成脚本血缘图后,还包括:
9.根据权利要求1所述的一种基于非校验的异构数据库数据血缘解析方法,其特征在于,所述读取sql脚本,具体为:
10.根据权利要求1所述的一种基于非校验的异构数据库数据血缘解析方法,其特征在于,所述方法还包括:使用python的logging模块对血缘解析各个步骤进行分级记录。
