【开源项目推荐】通用SQL数据血缘分析工具——Sqllineage

2024-06-04 2775阅读

【开源项目推荐】通用SQL数据血缘分析工具——Sqllineage 第1张

大家好,我是独孤风,从本周开始,争取每周为大家带来一个优秀的开源项目推荐。

开源项目不仅促进了技术的发展和普及,还为全球范围内的开发者和用户社区建立了一个共享知识、协作和创新的平台。站在巨人的肩膀上才能看的更远,我们平时也应该多多关注开源项目,不仅学习其丰富的知识,也要找机会为开源事业做出自己的贡献。

话不多说,今天为大家推荐的开源项目名为SQLLineage。

SQLLineage 是一个使用 Python 开发的 SQL 血缘分析工具。它专注于提供 SQL 查询的血缘关系和依赖关系的深入分析。

Github首页地址为:https://github.com/reata/sqllineage

目前标星891,最新版本是v1.4.8,主要开发语言为Python 。

【开源项目推荐】通用SQL数据血缘分析工具——Sqllineage 第2张

一、概述

简单来说SQLLineage 是一SQL血缘分析工具,而由于SQL在数据分析中的通用性,SQLLineage 是一数据血缘分析工具。

数据血缘(Data Lineage),也有翻译为数据沿袭,都数据血缘(Data Lineage)是指追踪数据从其源头到目的地的路径,包括它在整个数据生命周期中的流动、转换和使用情况。数据血缘的核心目的是提供对数据流动和变化的完整可视化,从而帮助组织理解数据的来源、经过的处理步骤以及最终如何被利用。

数据血缘是元数据管理的重要组成部分,通过收集获取元数据可以分析生成数据血缘,这样可以增加数据透明度,便于审计和合规,也就是说数据血缘在数据安全,数据管理领域意义重大。

而SQLLineage可以通过多SQL的分析来快速的了解血缘的来龙去脉,所以说是一个数据血缘的分析神器。

我们假设有这样的一个SQL。

【开源项目推荐】通用SQL数据血缘分析工具——Sqllineage 第3张

通过SQLLineage可以快速的分析出表级别的血缘。

【开源项目推荐】通用SQL数据血缘分析工具——Sqllineage 第4张

也可以分析出列级别的血缘。

【开源项目推荐】通用SQL数据血缘分析工具——Sqllineage 第5张

这样的话,数据的前后关系就一目了然了。

同时SQLLineage还支持多种SQL语法的解析器,这不管是我们直接拿来用,还是分析其代码都非常的有帮助。

【开源项目推荐】通用SQL数据血缘分析工具——Sqllineage 第6张

二、主要特性

SQLLineage 还提供了如下的丰富的功能支持。

简化 SQL 解析: SQLLineage 提供了一个简单易用的接口来理解 SQL 查询的源和目标表,无需担心复杂的 SQL 解析过程。

高效的解析库: 使用 sqlfluff 和 sqlparse 等库来解析 SQL 命令,分析 AST,并使用 networkx 图形库存储血缘信息。

易于安装和使用: 可以通过 PyPI 快速安装,并通过简单的命令行操作来解析 SQL 查询。

一些更高级的用法:

  • 处理多个 SQL 语句: 可以分析包含多个 SQL 语句的查询,识别中间表。

  • 详细血缘结果: 提供详细的血缘分析结果,每个 SQL 语句的血缘信息都可以显示出来。

  • 方言意识: 支持不同的 SQL 方言,以适应不同的关键词和语法。

  • 列级血缘: 支持列级血缘分析,展示所有列的血缘路径。

  • 血缘可视化: 支持血缘结果的图形可视化,可以在浏览器中查看表级和列级血缘的有向无环图(DAG)表示。

    三、安装部署与使用

    SQLLineage 由Python开发而成,所以可以非常方便的使用Python相关组件进行安装。

    安裝

    可以直接使用pip安装

    pip install sqllineage

    也可以通过github来安装

    pip install git+https://github.com/reata/sqllineage.git

    分析

    有两种方式,去解析sql。可以用-e直接分析一个sql语句,这里分析出了源表和目标表:

    $ sqllineage -e "insert into db1.table1 select * from db2.table2"
    Statements(#): 1
    Source Tables:
        db2.table2
    Target Tables:
        db1.table1

    也可以用-f来直接分析一个sql文件:

    $ sqllineage -f foo.sql
    Statements(#): 1
    Source Tables:
        db1.table_foo
        db1.table_bar
    Target Tables:
        db2.table_baz

    对于连续的两个sql也可以进行分析:

    $ sqllineage -e "insert into db1.table1 select * from db2.table2; insert into db3.table3 select * from db1.table1;"
    Statements(#): 2
    Source Tables:
        db2.table2
    Target Tables:
        db3.table3
    Intermediate Tables:
        db1.table1

    可以用-v指令来看每一个sql的执行结果。

    $ sqllineage -v -e "insert into db1.table1 select * from db2.table2; insert into db3.table3 select * from db1.table1;"
    Statement #1: insert into db1.table1 select * from db2.table2;
        table read: [Table: db2.table2]
        table write: [Table: db1.table1]
        table cte: []
        table rename: []
        table drop: []
    Statement #2: insert into db3.table3 select * from db1.table1;
        table read: [Table: db1.table1]
        table write: [Table: db3.table3]
        table cte: []
        table rename: []
        table drop: []
    ==========
    Summary:
    Statements(#): 2
    Source Tables:
        db2.table2
    Target Tables:
        db3.table3
    Intermediate Tables:
        db1.table1

    指定分析器

    下面的例子,可以使用 --dialect=postgres关键字来指定要使用的分析引擎:

    $ sqllineage -e "insert into analyze select * from foo;"
    Statements(#): 1
    Source Tables:
        .foo
    Target Tables:
    $ sqllineage -e "insert into analyze select * from foo;" --dialect=ansi
    Statements(#): 1
    Source Tables:
        .foo
    Target Tables:
        .analyze
    $ sqllineage -e "insert into analyze select * from foo;" --dialect=postgres
    ...
    sqllineage.exceptions.InvalidSyntaxException: This SQL statement is unparsable, please check potential syntax error for SQL

    提示:用这个命令sqllineage --dialects 看看都有哪些分析器。

    列级血缘

    可以分析列级血缘,比如下面的sql。

    INSERT OVERWRITE TABLE foo
    SELECT a.col1,
           b.col1     AS col2,
           c.col3_sum AS col3,
           col4,
           d.*
    FROM bar a
             JOIN baz b
                  ON a.id = b.bar_id
             LEFT JOIN (SELECT bar_id, sum(col3) AS col3_sum
                        FROM qux
                        GROUP BY bar_id) c
                       ON a.id = sq.bar_id
             CROSS JOIN quux d;
    INSERT OVERWRITE TABLE corge
    SELECT a.col1,
           a.col2 + b.col2 AS col2
    FROM foo a
             LEFT JOIN grault b
                  ON a.col1 = b.col1;

    可以使用-l关键字来进行列级血缘分析

    $ sqllineage -f foo.sql -l column
    .corge.col1 

    免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

    目录[+]