源代码:跨数据库通用“字段级”数据血缘解析与图形化(1/3:血缘信息的识别、提取、标注)
### 背景:
1、 数据血缘可以大幅提升数据治理、问题定位的能力,重要性不言而喻
2、 目前大部分数据血缘工具,往往只能做到表级血缘。而字段级血缘要么没有,要么不准,要么需要花大量人力维护
### 问题:
1、 能否通过一个命令,实现对不同关系型数据库的多种SQL脚本,自动解析出准确的字段级数据血缘数据?
2、 能否对字段级数据血缘进行图形化并实现追溯功能?
### 方案:
# 总体可以分为3个部分:
1、 使用 ZGLanguage 对SQL脚本文件进行解析转换,对脚本中的血缘信息进行识别、提取、标注,得到初级血缘标注信息
2、 使用 Python 对以上标注信息,进行:(a)代码层级拆解;(b)字段和表的映射识别检验;(c)得到最终字段级血缘数据并保存到mysql数据库中
3、 使用 Django 创建web应用,对数据库中的字段级血缘数据进行读取、图形化展示、上下游追溯
### 由于篇幅原因,将方案中的3个步骤,拆成3篇文章进行展示,此文章是第1部分:
# 创建跨数据库通用SQL语法解析转换配置文件:MARK_SQL_4_COLS_DATA_LINEAGE.syn,由于文件较大,可查看链接:
https://gitee.com/zgl-20053779/zglanguage/tree/master/etc/SQL_DATA_LINEAGE
# 使用配置文件 MARK_SQL_4_COLS_DATA_LINEAGE.syn 对SQL脚本(如:xxxxx.hql)进行处理,命令如下:
ZGLanguage -e MARK_SQL_4_COLS_DATA_LINEAGE.syn -t xxxxx.hql -o mark_sql_cols_data_lineage.zgl > log.log
### 实例结果演示:
# 实例源代码 :
DROP TABLE IF EXISTS bi_dw.dw_omc_sales_detail_f_tmp
;
CREATE TABLE bi_dw.dw_omc_sales_detail_f_tmp
(
company_wid int4,
org_id int4 COMMENT'机构ID',
org_code varchar(255) COMMENT'机构code',
org_name varchar(255),
customer_wid int4,
cust_account_id int4
)
distributed randomly
;
--ALTER TABLE bi_dw.dw_omc_sales_detail_f_tmp ADD PRIMARY KEY(invoice_number);
GRANT ALL PRIVILEGES ON bi_dw.dw_omc_sales_detail_f_tmp TO gkht_yibai;
set optimizer = off;
insert into bi_dw.dw_omc_sales_detail_f_tmp
(
company_wid,
org_id,
org_code,
org_name,
customer_wid,
cust_account_id
)
select
123 as company_wid,
ifnull(T.org_id, '9999') org_id,
T.org_code as org_code,
T.org_name,
T.customer_wid,
T.cust_account_id
FROM bi_dw.dw_om_sales_detail_f_data_tmp T
where 1=1
;
reset optimizer;
# 实例转换结果 :
__CREATE_TABLE_STRUCT__{:::}dw_omc_sales_detail_f_tmp{:::}
company_wid||int4||{###}
org_id||int4||'机构ID'{###}
org_code|| varchar(255)||'机构code'{###}
org_name|| varchar(255)||{###}
customer_wid||int4||{###}
cust_account_id||int4||
{111}
__DECLARE_VAR__{:::}optimizer
{111}
__INSERT_TABLE_SELECT__{:::}dw_omc_sales_detail_f_tmp{:::}
{###}<tartab_col_list>{###}company_wid,org_id,org_code,org_name,customer_wid,cust_account_id{###}</tartab_col_list>{###}
select
{###}<column_logic>{###}
123 as {###}<column_oth_name>{###}company_wid{###}</column_oth_name>{###}
{###}</column_logic>{###}
{###}<column_logic>{###}
ifnull( {###}<column_name>{###}T.org_id{###}</column_name>{###} , '9999' ) {###}<column_oth_name>{###}org_id{###}</column_oth_name>{###}
{###}</column_logic>{###}
{###}<column_logic>{###}
{###}<column_name>{###}T.org_code{###}</column_name>{###} as {###}<column_oth_name>{###}org_code{###}</column_oth_name>{###}
{###}</column_logic>{###}
{###}<column_logic>{###}
{###}<column_name>{###}T.org_name{###}</column_name>{###}
{###}</column_logic>{###}
{###}<column_logic>{###}
{###}<column_name>{###}T.customer_wid{###}</column_name>{###}
{###}</column_logic>{###}
{###}<column_logic>{###}
{###}<column_name>{###}T.cust_account_id{###}</column_name>{###}
{###}</column_logic>{###}
{###}<source_table_info>{###}
FROM||dw_om_sales_detail_f_data_tmp||T
{###}</source_table_info>{###}
{###}<source_table_condition>{###}
where 1 = 1
{###}</source_table_condition>{###}
{111}
- 点赞
- 收藏
- 关注作者
评论(0)