最近在忙数据质量的问题,说实话,数据质量不是技术,而是与业务息息相关的,怎么发现问题,怎么解释问题,怎么找到问题根源,怎么开展治理工作,只有一小部分是靠技术解决的,要想从根源上解决数据质量问题要需要从业务着手。

关于数据质量脚本自动化处理V1.0_数据质量

通常说的数据质量问题主要包括正确性、完整性、一致性、完备性、有效性,单域的、单表的数据质量问题可以通过一些机器学习的方式实现自我学习,或者人工判断的方式进行识别,相对容易;主数据的一致性、完整性、正确性则依赖于数据与数据的对比,然后数据与数据的对比,只能说明某一方或两方数据是有问题的,却不能证明哪一方是正确的,只能靠线下的核查,线下的核查更多的是靠业务管理部门的驱动。

本文只是数据质量问题数据的发现和一致率的提取,即把问题数据的SQL和校核数据分母的SQL固化下来,从各个源系统端进行比较。

由于考虑的比较仓促,所以代码的复用性有待优化,不过我写代码可读性还是不错的。

下面是创建了几个日志表:

--创建问题清单处理成功日志表
CREATE TABLE etl_problem_success_log(
statdate VARCHAR2(10),
step INTEGER,
ruletype VARCHAR2(100),
rulename VARCHAR2(100),
tablename VARCHAR2(50),
flag VARCHAR(50),
insertnum INTEGER,
sqlcode VARCHAR(1000),
sqlerr VARCHAR(1000),
execdatetime TIMESTAMP
);
--创建记录总数处理成功日志表
CREATE TABLE etl_recordnum_success_log(
statdate VARCHAR2(10),
step INTEGER,
ruletype VARCHAR2(100),
rulename VARCHAR2(100),
tablename VARCHAR2(50),
flag VARCHAR(50),
insertnum INTEGER,
sqlcode VARCHAR(1000),
sqlerr VARCHAR(1000),
execdatetime TIMESTAMP
);

--创建问题清单处理失败日志表
CREATE TABLE etl_problem_error_log(
statdate VARCHAR2(10),
step INTEGER,
ruletype VARCHAR2(100),
rulename VARCHAR2(100),
tablename VARCHAR2(50),
flag VARCHAR(50),
sqlcode VARCHAR(1000),
sqlerr VARCHAR(1000),
execdatetime TIMESTAMP
);
--创建记录总数处理失败日志表
CREATE TABLE etl_recordnum_error_log(
statdate VARCHAR2(10),
step INTEGER,
ruletype VARCHAR2(100),
rulename VARCHAR2(100),
tablename VARCHAR2(50),
flag VARCHAR(50),
sqlcode VARCHAR(1000),
sqlerr VARCHAR(1000),
execdatetime TIMESTAMP
);

下面是问题数据处理的存储过程,一个数据治理规则一段脚本

# 创建问题数据处理存储过程
CREATE OR REPLACE PROCEDURE p_insert_problem_detail
IS
vDate VARCHAR2(10); --获取当天日期
vExecDatetime TIMESTAMP; --获取当前脚本执行的时间
vStep INTEGER:=0; --记录当前执行步骤
vRuleType VARCHAR2(100); --协同场景类型
vRuleName VARCHAR2(100); --协同场景名称
vTableName VARCHAR2(50); --记录当前执行的表名
vInsertNum NUMBER(10); --记录当前执行插入的行数
vSQLCode VARCHAR2(1000); --记录错误编码
vSQLErr VARCHAR2(1000); --记录错误信息
BEGIN
vDate := TO_CHAR(SYSDATE,'YYYY-MM-DD');
--处理xx场景,xx业务规则表,插入问题数
BEGIN
vStep:=1;
vRuleType:=''; --场景名称
vRuleName:=''; --数据治理规则
vExecDatetime:=SYSTIMESTAMP;
vTableName:='tableA'; --问题清单数据表
INSERT INTO tableA --问题清单单脚本
SELECT vDate,A,B from AAA t;
vInsertNum:=SQL%ROWCOUNT;
INSERT INTO etl_problem_success_log
VALUES(vDate,vStep,vRuleType,vRuleName,vTableName,'Success',vInsertNum,vExecDatetime);
COMMIT;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
vSQLCode :=SQLCODE;
vSQLErr :=SQLERRM;
INSERT INTO etl_problem_error_log
VALUES(vDate,vStep,vRuleType,vRuleName,vTableName,'Error',vSQLCode, vSQLErr,vExecDatetime);
COMMIT;
END;

END p_insert_problem_detail;

下面是记录总数的存储过程,一个数据治理规则一段脚本

# 创建记录总数处理存储过程
CREATE OR REPLACE PROCEDURE p_insert_record_detail
IS
vDate VARCHAR2(10); --获取当天日期
vExecDatetime TIMESTAMP; --获取当前脚本执行的时间
vStep INTEGER:=0; --记录当前执行步骤
vRuleType VARCHAR2(100); --协同场景类型
vRuleName VARCHAR2(100); --协同场景名称
vTableName VARCHAR2(50); --记录当前执行的表名
vInsertNum NUMBER(10); --记录当前执行插入的行数
vSQLCode VARCHAR2(1000); --记录错误编码
vSQLErr VARCHAR2(1000); --记录错误信息
BEGIN
vDate := TO_CHAR(SYSDATE,'YYYY-MM-DD');
--处理业务规则表1,插入总记录数
BEGIN
vStep:=1;
vRuleType:='';
vRuleName:='';
vExecDatetime:=SYSTIMESTAMP;
vTableName:='tableA';
SELECT COUNT(*) INTO :vInsertNum FROM
(SELECT *******)
INSERT INTO etl_recordnum_success_log
VALUES(vDate,vStep,vTableName,'Success',vInsertNum,vExecDatetime);
COMMIT;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
vSQLCode :=SQLCODE;
vSQLErr :=SQLERRM;
INSERT INTO etl_recordnum_error_log
VALUES(vDate,vStep,vTableName,'Error',vSQLCode, vSQLErr,vExecDatetime);
COMMIT;
END;

END p_insert_problem_detail;


关于数据质量脚本自动化处理V1.0_sql_02