马哈鱼血缘分析工具介绍 

2022-04-26

    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