如果你的工作是从事数据挖掘、数据仓库建设或者信息系统开发/维护,有没有曾经遇到过如下的烦恼?
面对着几百上千张数据表,不知该如何关联,不知哪些表更有价值
执行着长的令人绝望,慢的无法忍受的SQL脚本,却不敢挥刀整改
准备着新功能上线,但总担心一行代码的修改会造成严重的生产事故
有没有科学的办法,来管理表之间、代码之间的复杂关系?从而帮助开发人员更好地认识和理解业务系统业务与底层表关系、底层表的表间关系,理清当前数据(字段、关键指标或者数据标签)从哪里来、到哪里去,搞清楚哪些下游系统在使用这些数据。
血缘分析是解决这类问题的一种技术手段。数据血缘(DataLineage),指的是数据从产生、ETL处理、加工、融合、流转到最终消亡,数据之间自然形成一种关系。这些关系就是描述数据的数据(元数据)。掌握了这个元数据,就能最大程度的做好数据的应用和管理。
那么如何推导数据之间的血缘关系呢?其实在开发或者分析师团队提供的成百上千的数据脚本中,每一行代码背后都蕴含着业务逻辑和数据关系。有没有可能通过批量解析这些数据脚本,自动提炼出背后的数据逻辑,以及脚本之间的依赖关系呢?
本文介绍一种针对python代码的推导方法。
既然解析的对象是python代码,我们首先要理解python的编译过程。以CPython为例,编译过程如下:
将源代码解析为解析树(ParserTree)
将解析树转换为抽象语法树(AbstractSyntaxTree)
将抽象语法树转换到控制流图(ControlFlowGraph)
根据流图将字节码(bytecode)发送给虚拟机(eval)
我们平常在python开发环境中编写代码时,IDE会提示各种编写过程中的语法错误,本质上是代码静态检查,对代码的内容和结构进行解析和分析,类似编译过程中的前三个步骤,让机器读懂代码并且判断其是否符合规范。
因此我们就可以利用这个原理,通过代码解析自动提取代码中的关键信息,例如代码
引用了哪些外部函数,进一步调用了哪些数据脚本
SQL语句使用了哪个数据源,查询了哪些表,更新了哪些字段
处理逻辑中对字段做了哪些衍生操作,用了什么算法
这种方法虽不能一键生成完整的开发文档,但却能提供大量丰富的线索,有助于快速开展梳理工作,事半功倍。
我们参考Pyflakes来实现以上功能,Pyflakes是Python的一个代码分析包,用来分析代码,发现潜在的代码问题,例如:引入但没有用到的模块、变量创建但是没有使用。查看Pyflakes的源码,可以发现其进一步使用ast模块,其用于生成和编译Python代码的抽象语法树,关于ast的介绍可以进一步查看