使用数据指标函数执行数据质量检查¶
本主题介绍如何将数据指标函数 (DMF) 与表或视图关联,以便定期执行数据质量检查。它还介绍了如何直接调用 DMF,例如,如果要在将 DMF 与表或视图关联之前对其进行测试。
关联 DMF 以自动执行数据质量检查¶
您可以将 DMF 与表或视图关联,以便定期自动调用它。关联 DMF 时,您指定将哪些列作为实参传递给 DMF。
将 DMF 与表或视图关联以自动执行数据质量检查的过程分为两个步骤:
在表或视图上设置计划,确定 DMFs 的执行频率。在将 DMF 与表或视图关联之前,您必须设置计划。
将 DMF 与表或视图关联。
计划 DMF 运行¶
您可以计划 DMFs 运行,以自动衡量表的数据质量。
Snowflake 使用表所有者角色(即对表具有 OWNERSHIP 权限的角色)调用计划的 DMF。表所有者角色必须具有以下授权:
对用户定义的 DMF 具有 USAGE 权限,以及对用于存储用户定义的 DMF 的数据库和架构具有 USAGE 权限。
DATA_METRIC_USER 数据库角色(如果 DMF 是系统 DMF)。
对账户具有 EXECUTE DATA METRIC FUNCTION 权限。
通过表、视图或物化视图的 DATA_METRIC_SCHEDULE 对象参数,可以计划 DMFs 何时运行。表或视图上的所有数据指标函数都遵循相同的计划。
可以通过三种方法计划 DMF 的运行:
将 DMF 设置为在指定的分钟数后运行。
使用 cron 表达式计划 DMF,使其按特定的频率运行。
使用触发事件计划 DMF 在表发生 :doc:`DML 更改 </sql-reference/sql-dml>`(例如,在表中插入新行)时运行。但是:
例如:
将数据指标函数计划设置为每 5 分钟运行一次:
ALTER TABLE hr.tables.empl_info SET DATA_METRIC_SCHEDULE = '5 MINUTE';
将数据指标函数计划设置为每天 8:00 AM 运行:
ALTER TABLE hr.tables.empl_info SET DATA_METRIC_SCHEDULE = 'USING CRON 0 8 * * * UTC';
将数据指标函数计划设置为仅在工作日的 8:00 AM 运行:
ALTER TABLE hr.tables.empl_info SET DATA_METRIC_SCHEDULE = 'USING CRON 0 8 * * MON,TUE,WED,THU,FRI UTC';
将数据指标函数计划设置为每天在 0600、1200 和 1800 UTC 时间运行三次:
ALTER TABLE hr.tables.empl_info SET DATA_METRIC_SCHEDULE = 'USING CRON 0 6,12,18 * * * UTC';
将数据指标函数设置为在常规 DML 操作(例如插入新行)修改表时运行:
ALTER TABLE hr.tables.empl_info SET DATA_METRIC_SCHEDULE = 'TRIGGER_ON_CHANGES';
您可以使用 SHOW PARAMETERS 命令查看支持的表对象的 DMF 计划:
SHOW PARAMETERS LIKE 'DATA_METRIC_SCHEDULE' IN TABLE hr.tables.empl_info;+----------------------+--------------------------------+---------+-------+------------------------------------------------------------------------------------------------------------------------------+--------+ | key | value | default | level | description | type | +----------------------+--------------------------------+---------+-------+------------------------------------------------------------------------------------------------------------------------------+--------+ | DATA_METRIC_SCHEDULE | USING CRON 0 6,12,18 * * * UTC | | TABLE | Specify the schedule that data metric functions associated to the table must be executed in order to be used for evaluation. | STRING | +----------------------+--------------------------------+---------+-------+------------------------------------------------------------------------------------------------------------------------------+--------+
对于视图和物化视图对象,将 TABLE
指定为对象域并按如下方式检查计划:
SHOW PARAMETERS LIKE 'DATA_METRIC_SCHEDULE' IN TABLE mydb.public.my_view;
备注
从修改表的 DMF 开始,会有 10 分钟的滞后,以便任何计划变更对分配给表的先前 DMFs 生效。但是,新分配到表的 DMF 不受 10 分钟延迟的限制。请仔细规划 DMF 计划和 DMF 取消设置操作,以符合您的预期 DMF 成本。
此外,当您评估 DMF 结果(如查询 DATA_QUALITY_MONITORING_RESULTS 视图)时,请在查询中指定 measurement_time
列作为评估的基础。DMF 评估由一个内部流程启动,在计划时间和测量时间之间可能会出现表更新(如 INSERT 操作)。使用 measurement_time
列时,可以更准确地评估 DMF 结果,因为测量时间可以指示 DMF 的评估时间。
将 DMF 与表关联¶
使用 ALTER TABLE 或 ALTER VIEW 命令关联 DMF 并指定哪些列作为实参传递。例如,以下命令将 NULL_COUNT 系统 DMF 与表 t
关联。DMF 运行时,它将返回列 c1
中的 NULL 值的数量。
ALTER TABLE t
ADD DATA METRIC FUNCTION SNOWFLAKE.CORE.NULL_COUNT
ON (c1);
有些 DMFs 不接受列作为参数。例如,要将 ROW_COUNT 系统 DMF 与视图 v2
关联,请运行以下命令:
ALTER VIEW v2
ADD DATA METRIC FUNCTION SNOWFLAKE.CORE.ROW_COUNT
ON ();
ACCEPTED_VALUES DMF 包含一个 lambda 表达式以及列名,这使您能够检查有多少记录不符合预期值。例如,以下语句将该函数与表 t1
关联,使函数返回 age
列值 不 等于五的记录数。
ALTER TABLE t1
ADD DATA METRIC FUNCTION SNOWFLAKE.CORE.ACCEPTED_VALUES ON (age, age -> age = 5);
从对象中删除 DMF¶
您可以使用 ALTER TABLE 或 ALTER VIEW 命令删除 DMF。例如:
ALTER TABLE t DROP DATA METRIC FUNCTION governance.dmfs.count_positive_numbers ON (c1, c2, c3);
手动调用 DMF¶
直接调用 DMF 有助于测试 DMF 的输出,然后将其与表或视图关联。
使用以下语法调用 DMF:
SELECT <data_metric_function>(<query>)
其中:
data_metric_function
指定系统定义或用户定义的 DMF。
query
指定对表或视图进行 SQL 查询。
查询投射的列必须与 DMF 签名中的列实参匹配。
例如,要调用一个自定义 DMF ``count_positive_numbers``(该函数接受三列作为实参),请运行以下命令:
SELECT governance.dmfs.count_positive_numbers(
SELECT c1, c2, c3
FROM t);
例如,要调用 NULL_COUNT(系统数据指标函数) 系统 DMF 来查看 ssn
列中的 NULL 值数量,请运行以下命令:
SELECT SNOWFLAKE.CORE.NULL_COUNT(
SELECT ssn
FROM hr.tables.empl_info);
如果自定义 DMF 接受来自多个表的参数,那么每个投影列的查询都必须用括号括起来。例如,如果您想手动调用 REFERENTIAL_CHECK DMF,请执行以下命令:
SELECT referential_check( (SELECT id FROM salesorders), (SELECT id FROM salespeople) );