马哈鱼数据血缘分析器是一个分析数据血缘关系的平台,支持20多种数据库的分析,满足数据血缘95%的分析场景,对表级,字段级的血缘关系有强大的分析能力,支持对大量复杂的数据快速准确的分析,并通过操作便捷的UI界面展示分析后的血缘。
关于马哈鱼的强大能力后续会陆续介绍,本文主要介绍如何利用马哈鱼分析SQL中的函数。
SQL:
insert into vsal (
deptno,
sal_sum
)
SELECT emp.deptno,
SUM(emp.sal) sal_sum
FROM scott.emp emp
WHERE city = 'NYC'
group by emp.deptno;
可以直观的看出 scott.emp.deptno
->vsal.deptno
,scott.emp.sal
->vsal.sal_num
两个直接关系,而对于其中的sal_num
实际上是来自于SUM(scott.emp.sal)
的聚合,在SQLFLow中默认是不显示这些function的关系,查看需要打开show function功能后就能看到聚合函数的血缘。如下:
结果:
可以看出vasl.sal_sum
来自SUM聚合之后的结果,打开settings中show transform功能,可以看到具体的聚合函数code,从而得到完整的血缘:scott.emp.sal
->SUM(scott.emp.sql)
->vsal.sal_num
。
SQL:
insert into lineage_fact
(
fact_guid
,first_execution_datetime
,last_execution_datetime
,mio_delta_hash
,mio_create_date_time
,mio_created_by
,mio_update_date_time
,mio_updated_by
,mio_source_system_cde
,user_id
,record_type
,predicates
,database_instance
)
select
md5(nvl(record_type,'-') ||
nvl(user_id,'-') ||
nvl(database_instance,'-')
) as fact_guid
,first_execution_datetime
,last_execution_datetime
,md5(nvl(to_char(last_execution_datetime , 'MM-DD-YYYY') , '-' )) as mio_delta_hash
,getdate() as mio_create_date_time
,'mio_glue_system-mio099_t_lineage_fact_load_prod' as mio_created_by
,getdate() as mio_update_date_time
,'mio_glue_system-mio099_t_lineage_fact_load_prod' as mio_updated_by
,'sqlflow' as mio_source_system_cde
,user_id
,record_type
,predicates
,database_instance
from (
select
(nullif(record_type,'nan')) as record_type
,(nullif(user_id,'nan')) as user_id
,(nullif(database_instance,'nan')) as database_instance
,listagg(distinct nullif(predicates,'nan')) as predicates
,min(TO_timestamp(timestamp_min, 'YYYY-MM-DD HH:MI:SS') ) as first_execution_datetime
,max(TO_timestamp(timestamp_max, 'YYYY-MM-DD HH:MI:SS') ) as last_execution_datetime
from spectrum.stg099
group by 1,2,3
);
这是一个redshift数据库的SQL,功能就是收集spectrum.stg099根据record_type
,user_id
,database_instance
分组,predicates
,first_execution_datetime
,last_execution_datetime
聚合之后的数据,并且根据这些数据再聚合生成fact_guid
,mio_delta_hash
和其他字段写入lineage_fact表。这样一个相对复杂的SQL,通过人工去核对血缘会是一件比较耗时的工作,但是通过SQLFLow解析之后再看就能很直观快速的找到其中的血缘,如下:
从分析后的UI可以直观的看出,lineage_fact表的各个字段都来自于spectrum.stg099表的哪些字段,而对于其中具体的细节来源,例如:
md5(nvl(record_type,'-') ||
nvl(user_id,'-') ||
nvl(database_instance,'-')
) as fact_guid
fact_guid
字段来源于record_type
,user_id
,database_instance
三个字段的聚合,如下:
从图中可以看出,fact_guid
是来自于对record_type
,user_id
,database_instance
三个字段的MD5聚合,然后继续回溯,可以看出这三个字段最终是来源于nullif(record_type,'nan')
,nullif(user_id,'nan')
,nullif(database_instance,'nan')
处理之后的结果:
并且如果想要查看节点在整个解析的SQL中的代码,SQLFLow也能强大的支持,如下:
整个SQL中直接关系所有涉及到的函数都成功被分析出来,可以直观的看出相应的数据流。
以上就是对马哈鱼SQLFLow分析分析SQL中的聚合函数,关于马哈鱼的等多功能,请参考下面链接:
马哈鱼数据血缘关系分析工具中文网站: https://www.sqlflow.cn
马哈鱼数据血缘关系分析工具英文网站: https://docs.gudusoft.com
马哈鱼数据血缘关系分析工具在线使用: https://sqlflow.gudusoft.com