接了一个新需求:需要做数据仓库的血缘关系。正所谓兵来将挡水来土掩,那咱就动手吧。
血缘关系是数据治理的一块,其实有专门的第三方数据治理框架,但考虑到目前的线上环境已经趋于稳定,引入新的框架无疑是劳民伤财,伤筋动骨,所以就想以最小的代价把这个事情给做了。目前我们考虑做的血缘关系呢只是做输入表和输出表,最后会形成一张表与表之间的链路图。这个东西的好处就是有助于仓库人员梳理业务,后面可能还会做字段之间的血缘关系等,后面做了再说,今天只是记录一下输入表和输出表的血缘关系。
我们线上的环境用来做etl的是hive sql和spark sql,所以想到的就是将hive sql和spark sql都拦截下来,然后通过语法解析,解析出其中的输入表和输出表。搞完这个这事就算是大功告成了。
首先第一步是拦截hive sql和spark sql,这个呢我们是直接在hive和spark的源码中切入了一小段代码用来拦截sql,然后将拦截到的sql存入到mysql中,这个暂且不做记录,后续补充,这里的重点是sql的解析。
其实做hive的血缘关系分析在源码中是有一个类可以参考的:org.apache.hadoop.hive.ql.tools.LineageInfo, 不过呢,这个例子不全面,不能覆盖到我们线上的情况。比如 hive中的with语法,create table语法就不能覆盖到,好巧不巧,跟仓库的同事聊过之后,with这种语法也是用的很多的,所以只需要在这个例子上加上一些东东,就基本可以满足我们的需求啦。
总结一下:其实做表与表之间的血缘关系只需要考虑到下面几种语法就差不多了:with,

本文介绍了如何在数据仓库环境中,通过拦截Hive和Spark SQL并进行语法解析,以获取输入表和输出表的血缘关系。使用自定义的`LineageUtils`类解析Hive SQL,涵盖了`WITH`, `CREATE TABLE`, `INSERT`, `SELECT`等语法,并讨论了如何处理未指定数据库名的情况。该方法作为数据治理的一部分,帮助仓库人员更好地理解和管理业务。"
105762963,5902156,C/C++编程获取Linux本机IP地址,"['Linux开发', 'C语言编程', '网络接口', '命令行工具']
最低0.47元/天 解锁文章
2133

被折叠的 条评论
为什么被折叠?



