SQLFlow通过分析SQL查询和存储过程来生成数据血缘关系。数据血缘关系模型中的实体包括表、列、函数、关系和其他实体。实体和数据流的组合显示了从一个表/列到另一个表/列的沿袭。
1、数据流单元
数据流单元包括源实体、目标实体以及它们之间的数据流类型。
SELECT p.FirstName from Person.Person AS p
这是为上述SQL查询生成的数据流。
person.persion.FirstName -> direct -> RS-1.FirstName
1.1 源、目标实体
源实体和目标实体通常引用表、视图和其他关系,例如公共表表达式、查询执行期间生成的结果集。它也可能指HDFS系统中的文件等。
1.2 数据流类型
数据流有两种类型:直接数据流(direct )和间接数据流(indirect )。
1.2.1 直接数据流(direct )
直接数据流意味着目标实体的数据直接来自源实体。
在上图中,RS-1.FirstName。直接来自Person.FirstName。
箭头用于表示图表中的直接数据流:
1.2.2 间接数据流(indirect )
间接数据流意味着目标列的数据不是来自源列,而是源列/表的数据影响目标列的结果数据。
虚线箭头用于表示图表中的间接数据流:
间接数据流中的源列通常出现在以下子句中:
-
Where 子句
-
Group by 子句
-
Winddows function
-
Join condition
SELECT deptno, COUNT() num_emp, SUM(SAL) sal_sum
FROM scott.emp
GROUP BY deptno
COUNT()和SUM(SAL)的值受group by子句中deptno列的值影响。因此,间接数据流将如下创建:
scott.emp.deptno -> indirect -> COUNT()
scott.emp.deptno -> indirect -> SUM(SAL)
对于其他间接数据流,我们将在后面讨论。
1.2.3 Join操作符
Join在联接条件中的两个或多个列之间建立链接。严格地说,这种关系不是数据流类型。
select b.teur from tbl a left join TT b on (a.key=b.key)
分析上述SQL后将创建连接关系。它表示tbl之间的连接关系,在tbl.key和TT.key之间。
2、数据流中的实体
在两个实体之间构建数据流时:源实体和目标实体。它们可以是列到列、表到列或表到表。
2.1 列对列
这是最常见的情况,数据流中的两个实体都是列。
2.2 表对列
当我们说一个表影响一列的值时,我们通常指的是一个表的行总数影响一列的值,通常,这个列是从COUNT()函数派生出来的。
SELECT COUNT() num_emp FROM scott.emp
表到列的数据流通过使用表RelationRows的 psedou列来表示,这将从scott构建一个间接数据流,关系行RS-1.num_emp。
scott.emp.RelationRows -> indirect -> COUNT() -> RS-1.num_emp
2.3 表对表
有时,两个表之间会有数据流。例如,在 alter table rename
SQL 语句, 将创建一个表到表的数据流。实际上,表到表的数据流由使用 RelationRows
表 pseudo 列.
alter table t2 rename to t3;
3、数据血缘
数据血缘关系由许多基本的数据流单元组成。
CREATE VIEW vsal
AS
SELECT a.deptno "Department",
a.num_emp / b.total_count "Employees",
a.sal_sum / b.total_sal "Salary"
FROM (SELECT deptno,
Count() num_emp,
SUM(sal) sal_sum
FROM scott.emp
WHERE city = 'NYC'
GROUP BY deptno) a,
(SELECT Count() total_count,
SUM(sal) total_sal
FROM scott.emp
WHERE city = 'NYC') b
数据血缘分析图:
输出也可以是XML或JSON格式。
4、参考
马哈鱼数据血缘分析器: https://sqlflow.gudusoft.com
马哈鱼数据血缘分析器中文网站: https://www.sqlflow.cn