马哈鱼——数据治理中Oracle SQL和存储过程的数据血缘分析

本文探讨了在数据治理中如何通过自动解析和分析Oracle SQL语句与存储过程,揭示数据血缘,以及如何借助SQLFlow工具实现SQL血缘分析的自动化。重点介绍了创建视图和存储过程中的数据流转,以及如何利用API进行数据血缘可视化和元数据集成。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据治理中的一个重要基础工作是分析组织中数据的血缘关系。有了完整的数据血缘关系,我们可以用它进行数据溯源、表和字段变更的影响分析、数据合规性的证明、数据质量的检查等。

分析数据血缘的方法主要分为四类

  • 自动解析
  • 系统跟踪
  • 机器学习
  • 人工收集

自动解析主要是利用工具解析 SQL 语句、存储过程和 ETL等文件。 本文以 Oracle 为例,来说明如何分析 SQL 和存储过程中的数据血缘。

产生数据血缘的 SQL 语句

  • SELECT
  • INSERT
  • UPDATE
  • MERGE
  • CREATE VIEW
  • CREATE TABLE
  • 存储过程

SELECT

可能你会感到奇怪, SELECT 语句没有对数据进行增、改操作,如何会产生数据血缘? 秘密就在于 SELECT 语句中的 select list 部分,在这里,可以对数据进行转换。 以下面这个 SELECT 语句为例:

select  sal + commission as totalSal
from emp;

我们可以看到,totalSal 字段的数据来自 emp.sal 和 emp.commission,在这里,数据进行了一次转换。 这种在 SELECT 内部产生的数据血缘是临时性的,但是这个 SELECT 语句和 CREATE VIEW 或者 CREATE TABLE 一结合,这个数据血缘就真正落地形成了。例如:

create view v_sal(mySal)
as
select  sal + commission as totalSal
from emp;

这个 CREATE VIEW 语句通过 SELECT 形成了 从 emp.sal 和 emp.commission 到 v_sal.mySal 的数据血缘。

因此我们可以知道,分析好 SELECT 语句是对 SQL 语句进行数据血缘分析的基础。总体来说,通过分析 SQL 语句来获得数据血缘是比较直观和简单的,但问题的关键是人工分析的效率太低,对于企业内众多的 SQL 来说,人工分析基本是不可能的。

存储过程

存储过程可以包含比较复杂的逻辑处理,例如条件判断、循环分支等。因此常用来完成数据抽取、转换、加载、清洗等任务。 这其中,就产生了大量的数据血缘关系。为了更好的对企业内数据进行治理,整理存储过程中的数据血缘工作是必不可少的。

分析存储过程中的数据血缘,游标 cursor 是一个关键因素,数据流一般都是围绕着游标进行处理。

在下面这个 Oracle PL/SQL 的存储过程中,首先定义了游标 CURSOR cur_stclerk。

DECLARE
	CURSOR cur_stclerk IS
		SELECT employee_id,
		department_id,
		first_name,
		last_name
		FROM employees
		WHERE job_id = 'ST_CLERK';

然后通过这个游标,用 LOOP 进行循环, 把数据从 employees 表中插入到表 emp_temp 和 emp_detls_temp。

INSERT INTO emp_temp
(employee_id,
department_id,
job_id)
VALUES (z_empid,
z_depid,
'ST_CLERK');

INSERT INTO emp_detls_temp
(employee_id,
empname)
VALUES (z_empid,
z_firstname
|| ' '
|| z_lastname);
END LOOP;

CLOSE cur_stclerk;
COMMIT;
END;

因此我们可以建立从 employees 表到表 emp_temp 和 emp_detls_temp 的数据血缘。

完整的 PLSQL 存储过程。

DECLARE
	z_empid employees.employee_id%TYPE;
	z_depid employees.department_id%TYPE;
	z_firstname employees.first_name%TYPE;
	z_lastname employees.last_name%TYPE;

	CURSOR cur_stclerk IS
		SELECT employee_id,
		department_id,
		first_name,
		last_name
		FROM employees
		WHERE job_id = 'ST_CLERK';
BEGIN
OPEN cur_stclerk;
LOOP
	FETCH cur_stclerk INTO z_empid,z_depid,z_firstname,
	z_lastname;
	EXIT WHEN cur_stclerk%NOTFOUND;

	INSERT INTO emp_temp
	(employee_id,
	department_id,
	job_id)
	VALUES (z_empid,
	z_depid,
	'ST_CLERK');

	INSERT INTO emp_detls_temp
	(employee_id,
	empname)
	VALUES (z_empid,
	z_firstname
	|| ' '
	|| z_lastname);
END LOOP;

CLOSE cur_stclerk;
COMMIT;
END;

自动化数据血缘分析工具

SQLFlow 支持分析多达 20 多种主流数据库的 SQL 语句。 支持的数据库有 bigquery, couchbase, dax, db2, greenplum, hana, hive, impala, informix, mdx, mysql, netezza, odbc, openedge, oracle, postgresql, redshift, snowflake, sparksql, sqlserver, sybase, teradata, vertica。

支持分析存储过程和动态 SQL 语句。

通过 UI 分析 SQL 语句

通过 SQLFlow 的 UI 可以快速的获取一个 SQL 的数据血缘情况, 并可以得到可视化的结果,帮助用户迅速了解一个 SQL 中的数据血缘。

通过 API 方式分析 SQL 的数据血缘

有时,我们需要把分析所得的数据血缘作为元数据存储到我们自己的数据治理平台中,和其它元数据进行整合, 这时,我们可以利用 SQLFlow 提供的 Restful API, 利用 shell, python 等脚本对数据血缘分析工作进行自动化。

这里用 curl 展示如何用 API 访问 SQLFlow 进行数据血缘分析。

  • 准备好用 API 连接 SQLFlow 需要的 userid 和 secret code
  • 利用 userid 和 secret code 来获取 token。注意,用你自己的 userid 和 secret code 来替换掉命令中的对应部分。
curl -X POST "https://api.gudusoft.com/gspLive_backend/user/generateToken" -H  "Request-Origion:testClientDemo" -H  "accept:application/json;charset=utf-8" -H  "Content-Type:application/x-www-form-urlencoded;charset=UTF-8" -d "secretKey=YOUR SECRET KEY" -d "userId=YOUR USER ID HERE"
  • 把需要分析的 SQL 语句递交给 SQLFlow 进行分析,并返回处理结果。注意,用你自己的 userid 和上面命令中返回的 token 来替换掉命令中的对应部分。
curl -X POST "https://api.gudusoft.com/gspLive_backend/sqlflow/generation/sqlflow?showRelationType=fdd" -H  "Request-Origion:testClientDemo" -H  "accept:application/json;charset=utf-8" -H  "Content-Type:multipart/form-data" -F "sqlfile=" -F "dbvendor=dbvoracle" -F "ignoreRecordSet=true" -F "simpleOutput=false" -F "sqltext=create view v_sal(mySal) as select  sal + commission as totalSal from emp;" -F "userId=YOUR USER ID HERE"  -F "token=YOUR TOKEN HERE"
  • 返回的 json 包含了如下数据血缘关系。
"relations": [
	{
		"id": "3",
		"type": "fdd",
		"effectType": "create_view",
		"target": {
			"id": "11",
			"column": "mySal",
			"parentId": "9",
			"parentName": "v_sal",
		},
		"sources": [
			{
				"id": "3",
				"column": "sal",
				"parentId": "2",
				"parentName": "emp",
			},
			{
				"id": "4",
				"column": "commission",
				"parentId": "2",
				"parentName": "emp",
			}
		],
		"processId": "10"
	}
]

更详细的信息见官网 SQLFlow Restful API

小结

本文介绍了如何通过分析 Oracle 的 SQL 语句和存储过程来获取组织中的数据血缘,从而更好的进行数据治理。 并介绍了如何利用 SQLFlow 工具把分析 SQL 语句中的数据血缘工作自动化, 提高数据自理效率和水平。

<think>好的,我现在需要处理用户关于数据血缘的问题。用户想了解数据血缘的概念、工具以及实现方法。首先,我需要明确数据血缘的基本定义,确保自己理解正确。根据引用[3],数据血缘分析系统帮助追踪数据的来源、转换流动,这对数据治理质量很重要。接下来,我要整理概念部分,可能包括血缘的核心要素,比如来源、转换过程、依赖关系等。 然后,关于工具部分,用户提到马哈工具,引用[2]中介绍了它的可视化功能,我需要详细说明这个工具的特点使用方法。此外,引用[3]提到开源工具,如Apache AtlasAmundsen,需要列举并简要描述它们的用途优势,比如Apache Atlas适合Hadoop生态,Amundsen用于元数据管理。 在实现方法方面,需要分步骤解释,比如元数据采集、血缘解析、存储可视化。可能需要结合引用中的信息,例如元数据采集可以通过解析SQL或日志,血缘解析使用图数据库存储关系,最后通过可视化工具展示。还要注意引用来源,比如在提到数据血缘的重要性时引用[3],提到马哈工具时引用[2]。 用户可能还想知道数据血缘与其他概念的区别,比如数据关系、知识图谱,这部分引用[1]中提到对比,需要简要说明区别,但用户的问题可能更关注工具实现,所以这部分可以放在概念里简要带过。 需要确保回答结构清晰,分点列出概念、工具、实现方法,每个部分下再细分小点。同时,生成的相关问题要围绕用户可能进一步想了解的内容,比如开源工具、与数据治理的关系、技术难点等,参考引用中的内容来设计问题。 最后检查是否符合系统级指令:使用中文,数学公式用$...$(但这里可能用不上),引用标识正确添加,代码块格式正确(如果有的话)。确保回答真实可靠,引用相关来源,结构逻辑清晰。</think>### 数据血缘管理:概念、工具与实现方法 #### 一、数据血缘的概念 数据血缘(Data Lineage)用于追踪数据的来源、转换过程、流动路径及最终去向,是数据治理的核心组成部分。其核心要素包括: 1. **数据来源**:数据的初始产生位置,如数据库表、API接口或文件[^3]。 2. **转换逻辑**:数据在ETL(抽取、转换、加载)过程中的处理规则,例如字段计算、聚合操作等。 3. **依赖关系**:数据表、字段之间的上下游依赖,例如$A \rightarrow B \rightarrow C$的链式依赖[^1]。 数据血缘与相关概念的对比: - **数据关系**:仅描述静态关联,而血缘强调动态流动。 - **知识图谱**:以语义网络表达复杂关系,血缘更聚焦技术层面的数据链路[^1]。 #### 二、常用工具 1. **马哈数据血缘分析工具** - 支持SQL解析自动生成可视化血缘图,首次使用时需配置数据源并执行解析脚本[^2]。 - 示例流程: ```python # 伪代码示例:解析SQL生成血缘 def parse_sql(sql): extract_tables(sql) build_dependency_graph() return lineage_map ``` 2. **开源工具** - **Apache Atlas**:适用于Hadoop生态,通过元数据钩子(Hook)捕获血缘[^3]。 - **Amundsen**:基于Neo4j图数据库,支持列级血缘追踪。 #### 三、实现方法 1. **元数据采集** - 解析SQL脚本、ETL任务日志或数据库日志,提取表级/字段级依赖。 - 工具示例:使用ANTLR解析SQL语法树。 2. **血缘解析与存储** - 使用图数据库(如Neo4j)存储节点(数据实体)边(转换关系),例如: $$G=(V,E), \quad V=\{表,字段\}, \quad E=\{依赖关系\}$$ 3. **可视化与查询** - 基于D3.js或Echarts构建交互式血缘图,支持回溯上游来源或下影响分析[^2]。 #### 四、典型应用场景 - **数据质量治理**:定位数据异常根源(如某指标错误可追溯至原始表清洗逻辑)。 - **合规审计**:满足GDPR等法规对数据溯源性要求[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值