数据质量规则配置实践教程

数据质量保障了企业业务决策的准确性与可靠性,提升了运营效率与降低业务成本。本教程旨在通过从简单到复杂的业务场景,指导您如何系统性地创建数据质量监控,将质量保障融入数据生成流程,为数据保驾护航。

前提条件

已购买数据质量功能。

数据准备

  • 创建一个dataphin_v50_dev项目,用于数据校验及创建质量规则。

  • 已发布用户表(user)、订单表(order1)和订单状态表(order_status_history)。

  • 脚本语句如下,可下载样例数据,使用本地文件输入组件和MaxCompute输出组件将数据同步至Dataphin。

    样例数据:用户表.csv订单表.csv订单状态表.csv

    MaxCompute一键建表语句如下:

    订单表

    create table IF NOT EXISTS  `order1` (
            `customer_id` string comment '用户ID',
    	`crt_ord_id` double comment 'order_id',
    	`delivery_address_id` double comment '收货地址',
    	`buyer_id` double comment '买家ID',
    	`gmt_create` string comment '创建时间',
    	`gmt_modified` string comment '修改时间',
    	`order_time` string comment '下单时间',
    	`pay_time` string comment '支付时间',
    	`ship_time` string comment '发货时间',
    	`end_time` string comment '交易完成/交易取消 时间',
    	`total_items_amount` double comment '总商品金额,单价*件数',
    	`discount_amount` double comment '总折扣金额,单位分',
    	`delivery_amount` double comment '运费单位分',
    	`total_amount` double comment '实付总金额单位分',
    	`status` double comment '状态:-1已取消1新建2已支付3已发货4确认发货'
    )
    comment 'order1'
    lifecycle 3600

    用户表

    create table IF NOT EXISTS `user` (
    	`user_id` string comment '用户ID',
    	`name` string comment '姓名',
    	`gender` string comment '性别',
    	`age` string comment '年龄',
    	`phone_num` string comment '手机号码'
    )
    comment 'user'
    lifecycle 3600

    订单状态表

    CREATE TABLE IF NOT EXISTS order_status_history (
    	id Double NOT NULL COMMENT '自增主键',
    	order_id STRING COMMENT '关联的订单ID(外键,指向订单主表)',
    	`status` STRING COMMENT '订单状态(如created/paid/shipped/cancelled等)',
    	update_time STRING COMMENT '状态变更时间(通常按此字段排序)',
    	operator STRING COMMENT '操作人(可能是系统自动触发,如system,或人工操作,如user:1001)',
    	remark STRING COMMENT '变更备注(例如取消原因,“用户主动取消”)'
    )
    STORED AS ALIORC
    TBLPROPERTIES (
    	'columnar.nested.type' = 'true',
    	'transactional' = 'true'
    );

规则强度说明

  • 强规则:当质量规则校验的结果为异常时,系统会报警并阻塞下游任务节点。

  • 弱规则:当质量规则校验的结果为异常时,系统会报警但不阻塞下游任务节点。

质量规则配置流程

建议先创建调度配置,告警配置和异常归档表,便于顺利创建质量规则。调度配置告警配置异常归档表的创建方式与空值质量规则一致,请参见空值校验质量规则

基础场景配置示例

空值校验

场景描述:在用户表中,手机号字段是联系用户的关键标识,不允许为空。创建空值校验质量规则,对用户表中的手机号码为空的字段进行检测,识别手机号字段值为空的异常数据。

创建质量规则

  1. Dataphin首页的顶部菜单栏,选择治理 > 数据质量

  2. 单击左侧导航栏的质量规则,在Dataphin页签,单击添加监控对象按钮,进入添加监控对象对话框。

  3. 添加监控对象对话框中,配置参数后,单击配置质量规则

    参数

    描述

    板块/项目

    选择项目dataphin_v50_dev

    数据表

    选择user

    质量负责人

    默认SuperAdmin

    质量分权重

    默认1

  4. 质量规则详情页面,单击新建质量规则按钮,选择自定义配置,在新建质量规则对话框中,配置质量规则。

    参数

    描述

    基本信息

    规则名称

    输入手机号不为空

    规则强度

    选择强规则

    描述

    可以填写对质量规则的简单描述。例如:检测user表手机号为空,则校验不通过。

    配置方式

    选择模板创建

    规则模板

    选择完整性/字段空值校验

    规则类型

    根据规则模板默认填充。

    模板配置

    参数配置

    根据规则模板默认展示,无需填写。

    规则配置

    校验字段

    选择phone_num

    数据过滤

    输入phone_num is null

    校验配置

    规则校验

    选择异常率<=0,只要有一条异常数据,则校验不通过。

    归档配置

    异常归档

    开启异常归档。

    归档模式

    选择归档完整记录

    归档位置

    选择自定义异常归档表(dataphin_v50_dev.user1_exception_data)。

    调度属性配置

    调度方式

    选择定时调度

    质量分配置

    计分方式

    默认质量校验状态

    质量分权重

    默认为1

  5. 单击确定,完成空值校验质量规则创建。

  6. 在规则配置列表,选择phone_num对象,单击操作列下的更多,选择试跑,在试跑对话框中,选择自定义校验范围,单击确定

    试跑结束后,因user表中有手机号码为空的数据,故试跑不通过。

    image

  7. 异常数据都记录在dataphin_v50_dev.user1_exception_data异常归档表中,可在研发 > 数据研发 > 计算任务,创建MAX_COMPUTE_SQL任务查看异常数据。

    select dataphin_quality_rule_id,user_id,phone_num
    from    dataphin_v50_dev.user1_exception_data
    where   dataphin_quality_validate_date = '20251120';

    image

调度配置
  1. 调度配置页签,单击新建调度按钮,进入新建调度对话框。

  2. 新建调度对话框中,配置参数。

    参数

    描述

    调度配置

    调度名称

    输入定时调度

    调度类型

    选择定时调度

    调度日期

    选择6:00

    调度条件

    打开调度条件,选择业务日期在普通日历的月份属于1月到12月。如图:

    image

    校验范围

    校验范围表达式

    选择full table。

  3. 单击确定,完成调度创建。

告警配置
  1. 告警配置页签,单击新建告警配置按钮,进入新建告警配置对话框。

  2. 新建告警配置对话框中,配置参数。

    参数

    描述

    覆盖范围

    选择所有强规则

    告警配置名称

    输入所有强规则告警

    告警接收人

    选择质量负责人,告警方式选择电话、邮件、短信、钉钉、飞书、企业微信

  3. 单击确定,完成告警配置的创建。

异常归档表
  1. 异常归档表页签,单击添加异常归档表按钮,进入添加异常归档表对话框。

  2. 添加异常归档表对话框中,选择新建表添加方式,创建dataphin_v50_dev.user1_exception_data异常归档表。

  3. 单击确定,完成异常归档表创建。

唯一值校验

场景描述:订单号作为订单表的唯一标识符,必须保证全局唯一。创建唯一值校验质量规则,对订单表中订单ID不唯一的字段进行检测,识别订单ID字段值不唯一的异常数据。

创建质量规则

  1. Dataphin首页的顶部菜单栏,选择治理 > 数据质量

  2. 单击左侧导航栏的质量规则,在Dataphin页签,单击添加监控对象按钮,进入添加监控对象对话框。

  3. 添加监控对象对话框中,配置参数后,单击配置质量规则

    参数

    描述

    板块/项目

    选择项目/dataphin_v50_dev

    数据表

    选择order1

    质量负责人

    默认SuperAdmin

    质量分权重

    默认1

  4. 质量规则详情页面,单击新建质量规则按钮,选择自定义配置,在新建质量规则对话框中,配置质量规则。

    参数

    描述

    基本信息

    规则名称

    输入订单号唯一值校验

    规则强度

    选择强规则

    描述

    可以填写对质量规则的简单描述。例如:检测order1表订单号不唯一,则校验不通过。

    配置方式

    选择模板创建

    规则模板

    选择唯一性/字段唯一性校验

    规则类型

    根据规则模板默认填充。

    模板配置

    参数配置

    根据规则模板默认展示,无需填写。

    规则配置

    校验字段

    选择crt_ord_id

    数据过滤

    关闭数据过滤。

    校验配置

    规则校验

    选择异常率<=0,只要有一条异常数据,则校验不通过。

    归档配置

    异常归档

    开启异常归档。

    归档模式

    选择归档完整记录

    归档位置

    选择自定义异常归档表(dataphin_v50_dev.order1_exception_data)。

    调度属性配置

    调度方式

    选择定时调度

    质量分配置

    计分方式

    默认质量校验状态

    质量分权重

    默认为1

  5. 单击确定,完成唯一值校验质量规则创建。

  6. 在规则配置列表,选择crt_ord_id对象,单击操作列下的更多,选择试跑,在试跑对话框中,选择自定义校验范围,单击确定

    试跑结束后,因order1表中有手机号码为空的数据,故试跑不通过。

    image

  7. 异常数据都记录在dataphin_v50_dev.order1_exception_data异常归档表中,可在研发 > 数据研发 > 计算任务,创建MAX_COMPUTE_SQL任务查看异常数据。

    select crt_ord_id, COUNT(1) as cnt
    from   dataphin_v50_dev.order1_exception_data
    where   dataphin_quality_validate_date = '20251120'
    GROUP BY crt_ord_id
    HAVING COUNT(1) > 1;

    image

稍复杂场景配置示例

两表字段值一致性校验

场景描述:订单表中的用户ID必须是用户表中存在的有效ID。如果订单表引用了不存在的客户ID,则该条数据为脏数据。创建两表字段值一致性校验质量规则,对订单表中用户ID在用户表中不存在的字段进行检测,识别用户ID字段值不存在的异常数据。

创建质量规则

  1. Dataphin首页的顶部菜单栏,选择治理 > 数据质量

  2. 单击左侧导航栏的质量规则,在Dataphin页签,单击添加监控对象按钮,进入添加监控对象对话框。

  3. 添加监控对象对话框中,配置参数后,单击配置质量规则

    参数

    描述

    板块/项目

    选择项目dataphin_v50_dev

    数据表

    选择order1

    质量负责人

    默认SuperAdmin

    质量分权重

    默认1

  4. 质量规则详情页面,单击新建质量规则按钮,选择自定义配置,在新建质量规则对话框中,配置质量规则。

    参数

    描述

    基本信息

    规则名称

    输入用户ID一致性校验

    规则强度

    选择强规则

    描述

    可以填写对质量规则的简单描述。例如:检测到order1表用户IDuser表不存在,则校验不通过。

    配置方式

    选择模板创建

    规则模板

    选择一致性/两表字段值一致性校验

    规则类型

    根据规则模板默认填充。

    模板配置

    参数配置

    根据规则模板默认展示,无需填写。

    规则配置

    校验字段

    选择customer_id

    选择比较表

    选择表dataphin_v50_dev.user,字段选择user_id

    关联方式

    选择left join

    关联表达式

    输入T1.customer_id=T2.user_id

    数据过滤

    输入T2.user_id is null

    校验配置

    规则校验

    选择异常率<=0,只要有一条异常数据,则校验不通过。

    归档配置

    异常归档

    开启异常归档。

    归档模式

    选择归档完整记录

    归档位置

    选择自定义异常归档表(dataphin_v50_dev.order2_exception_data)。

    调度属性配置

    调度方式

    选择定时调度

    质量分配置

    计分方式

    默认质量校验状态

    质量分权重

    默认为1

  5. 单击确定,完成空值校验质量规则创建。

  6. 在规则配置列表,选择customer_id对象,单击操作列下的更多,选择试跑,在试跑对话框中,选择自定义校验范围,单击确定

    试跑结束后,因检测到order1表中的用户IDuser表中不存在的数据,故试跑不通过。

    image

  7. 异常数据都记录在dataphin_v50_dev.order2_exception_data异常归档表中,可在研发 > 数据研发 > 计算任务,创建MAX_COMPUTE_SQL任务查看异常数据。

    select dataphin_quality_rule_id,customer_id,crt_ord_id
    from    dataphin_v50_dev.order2_exception_data
    where   dataphin_quality_validate_date = '20251120'

    image

字段值域校验

场景描述:用户表中的年龄需在合理的范围内,如:20岁~99岁。超出此范围可能是录入错误、测试数据等,属于异常数据。创建字段值域校验质量规则,对用户表中年龄不在20~99范围的数据进行检测,识别年龄字段值不在合理范围的异常数据。

创建质量规则

  1. Dataphin首页的顶部菜单栏,选择治理 > 数据质量

  2. 单击左侧导航栏的质量规则,在Dataphin页签,单击添加监控对象按钮,进入添加监控对象对话框。

  3. 添加监控对象对话框中,配置参数后,单击配置质量规则

    参数

    描述

    板块/项目

    选择项目dataphin_v50_dev

    数据表

    选择user

    质量负责人

    默认SuperAdmin

    质量分权重

    默认1

  4. 质量规则详情页面,单击新建质量规则按钮,选择自定义配置,在新建质量规则对话框中,配置质量规则。

    参数

    描述

    基本信息

    规则名称

    输入年龄值域校验

    规则强度

    选择强规则

    描述

    可以填写对质量规则的简单描述。例如:检测到user表中年龄不在20岁到99岁之间,则校验不通过。

    配置方式

    选择模板创建

    规则模板

    选择有效性/字段值域校验

    规则类型

    根据规则模板默认填充。

    模板配置

    参数配置

    根据规则模板默认展示,无需填写。

    规则配置

    校验字段

    选择age

    值域类型

    选择文本

    值域范围

    区间选择>=20<=99

    数据过滤

    关闭数据过滤。

    校验配置

    规则校验

    选择异常率<=0,只要有一条异常数据,则校验不通过。

    归档配置

    异常归档

    开启异常归档。

    归档模式

    选择归档完整记录

    归档位置

    选择自定义异常归档表(dataphin_v50_dev.user2_exception_data)。

    调度属性配置

    调度方式

    选择定时调度

    质量分配置

    计分方式

    默认质量校验状态

    质量分权重

    默认为1

  5. 单击确定,完成空值校验质量规则创建。

  6. 在规则配置列表,选择age对象,单击操作列下的更多,选择试跑,在试跑对话框中,选择自定义校验范围,单击确定

    试跑结束后,因检测到user表中年龄不在20岁到99岁之间,故试跑不通过。

    image

  7. 异常数据都记录在dataphin_v50_dev.user2_exception_data异常归档表中,可在研发 > 数据研发 > 计算任务,创建MAX_COMPUTE_SQL任务查看异常数据。

    select  dataphin_quality_rule_task_id
           ,user_id
           ,age
    from    dataphin_v50_dev.user2_exception_data
    where   dataphin_quality_validate_date = '20251121'

    image

复杂场景配置示例

场景描述:发货表的订单支付状态流转有效性校验,当符合下方其中一个规则,则质量校验不会通过。

  • 订单状态不能从已发货直接变为已取消。

  • 订单必须先已支付才能变为已发货。

  • 已退款的订单必须先有支付记录。

  • 已签收的订单必须先有发货记录。

创建质量规则

  1. Dataphin首页的顶部菜单栏,选择治理 > 数据质量

  2. 单击左侧导航栏的质量规则,在Dataphin页签,单击添加监控对象按钮,进入添加监控对象对话框。

  3. 添加监控对象对话框中,配置参数后,单击配置质量规则

    参数

    描述

    板块/项目

    选择项目dataphin_v50_dev

    数据表

    选择order_status_history

    质量负责人

    默认SuperAdmin

    质量分权重

    默认1

  4. 质量规则详情页面,单击新建质量规则按钮,选择自定义配置,在新建质量规则对话框中,配置质量规则。

    参数

    描述

    基本信息

    规则名称

    输入电商平台订单支付状态流转有效性校验

    规则强度

    选择强规则

    描述

    可以填写对质量规则的简单描述。例如:

    • 订单状态不能从已取消直接变为已发货。

    • 订单必须先已支付才能变为已发货。

    • 已退款的订单必须先有支付记录。

    • 已签收的订单必须先有发货记录。

    配置方式

    选择模板创建

    规则模板

    选择自定义/自定义数据详情校验

    规则类型

    选择有效性

    模板配置

    参数配置

    根据规则模板默认展示,无需填写。

    规则配置

    总行数SQL

    输入如下SQL。

    select count(*) from order_status_history;

    异常行数SQL/异常数据SQL

    输入SQL,详见表格下方SQL语句。

    校验配置

    规则校验

    选择异常率<=0,只要有一条异常数据,则校验不通过。

    归档配置

    异常归档

    开启异常归档。

    归档模式

    选择归档完整记录

    归档位置

    选择自定义异常归档表(dataphin_v50_dev.order_status_history_exception_data)。

    调度属性配置

    调度方式

    选择定时调度

    质量分配置

    计分方式

    默认质量校验状态

    质量分权重

    默认为1

    异常行数SQL
    SELECT 
    count(*)
    FROM 
    (    SELECT 
            id,
            order_id,
            status AS current_status,
            update_time AS current_update_time,
            operator AS current_operator,
            remark AS current_remark,
            -- 获取前一行数据
            LAG(id) OVER (PARTITION BY order_id ORDER BY cast(update_time as TIMESTAMP )) AS previous_id,
            LAG(status) OVER (PARTITION BY order_id ORDER BY cast(update_time as TIMESTAMP )) AS previous_status,
            LAG(update_time) OVER (PARTITION BY order_id ORDER BY cast(update_time as TIMESTAMP )) AS previous_update_time,
            LAG(operator) OVER (PARTITION BY order_id ORDER BY cast(update_time as TIMESTAMP )) AS previous_operator,
            LAG(remark) OVER (PARTITION BY order_id ORDER BY cast(update_time as TIMESTAMP )) AS previous_remark
        FROM order_status_history) temp_table
    WHERE (previous_status = 'cancelled' AND current_status = 'shipped')
       OR (previous_status <> 'paid' AND current_status = 'shipped')
       OR (previous_status = 'refunded' AND current_status NOT IN ('created', 'cancelled'))
       OR (previous_status = 'delivered' AND current_status = 'shipped')
    异常数据SQL
    SELECT 
        previous_id as  id,
        order_id,
        previous_status AS status,
        previous_update_time AS update_time,
        previous_operator AS operator,
        previous_remark AS remark
    FROM 
    (    SELECT
            id,
            order_id,
            status AS current_status,
            update_time AS current_update_time,
            operator AS current_operator,
            remark AS current_remark,
            -- 获取前一行数据
            LAG(id) OVER (PARTITION BY order_id ORDER BY cast(update_time as TIMESTAMP )) AS previous_id,
            LAG(status) OVER (PARTITION BY order_id ORDER BY cast(update_time as TIMESTAMP )) AS previous_status,
            LAG(update_time) OVER (PARTITION BY order_id ORDER BY cast(update_time as TIMESTAMP )) AS previous_update_time,
            LAG(operator) OVER (PARTITION BY order_id ORDER BY cast(update_time as TIMESTAMP )) AS previous_operator,
            LAG(remark) OVER (PARTITION BY order_id ORDER BY cast(update_time as TIMESTAMP )) AS previous_remark
        FROM order_status_history) temp_table
    WHERE (previous_status = 'cancelled' AND current_status = 'shipped')
       OR (previous_status <> 'paid' AND current_status = 'shipped')
       OR (previous_status = 'refunded' AND current_status NOT IN ('created', 'cancelled'))
       OR (previous_status = 'delivered' AND current_status = 'shipped')
    UNION ALL
    SELECT 
        id AS id,
        order_id,
        current_status AS status,
        current_update_time AS update_time,
        current_operator AS operator,
        current_remark AS remark
    FROM (    SELECT 
            id,
            order_id,
            status AS current_status,
            update_time AS current_update_time,
            operator AS current_operator,
            remark AS current_remark,
            -- 获取前一行数据
            LAG(id) OVER (PARTITION BY order_id ORDER BY cast(update_time as TIMESTAMP )) AS previous_id,
            LAG(status) OVER (PARTITION BY order_id ORDER BY cast(update_time as TIMESTAMP )) AS previous_status,
            LAG(update_time) OVER (PARTITION BY order_id ORDER BY cast(update_time as TIMESTAMP )) AS previous_update_time,
            LAG(operator) OVER (PARTITION BY order_id ORDER BY cast(update_time as TIMESTAMP )) AS previous_operator,
            LAG(remark) OVER (PARTITION BY order_id ORDER BY cast(update_time as TIMESTAMP )) AS previous_remark
        FROM order_status_history) temp_table
    WHERE (previous_status = 'cancelled' AND current_status = 'shipped')
       OR (previous_status <> 'paid' AND current_status = 'shipped')
       OR (previous_status = 'refunded' AND current_status NOT IN ('created', 'cancelled'))
       OR (previous_status = 'delivered' AND current_status = 'shipped')
    ORDER BY order_id, update_time;
  5. 单击确定,完成空值校验质量规则创建。

  6. 在规则配置列表,选择dataphin_v50_dev.order_status_history对象,单击操作列下的更多,选择试跑,在试跑对话框中,选择自定义校验范围,单击确定

    试跑结束后,因检测到发货表中有订单流转状态存在异常,故试跑不通过。

    image

  7. 异常数据都记录在dataphin_v50_dev.order_status_history_exception_data异常归档表中,可在研发 > 数据研发 > 计算任务,创建MAX_COMPUTE_SQL任务查看异常数据。

    select  *
    from    dataphin_v50_dev.order_status_history_exception_data
    where   dataphin_quality_validate_date = '20251121'

    image