使用数据指标函数执行数据质量检查

本主题介绍如何将数据指标函数 (DMF) 与表或视图关联,以便定期执行数据质量检查。它还介绍了如何直接调用 DMF,例如,如果要在将 DMF 与表或视图关联之前对其进行测试。

关联 DMF 以自动执行数据质量检查

您可以将 DMF 与表或视图关联,以便定期自动调用它。关联 DMF 时,您指定将哪些列作为实参传递给 DMF。

将 DMF 与表或视图关联以自动执行数据质量检查的过程分为两个步骤:

  1. 在表或视图上设置计划,确定 DMFs 的执行频率。在将 DMF 与表或视图关联之前,您必须设置计划。

  2. 将 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>`(例如,在表中插入新行)时运行。但是:

    • 表的重聚类 不会触发 DMF 运行。

    • 触发方法只适用于某些类型的表。有关更多信息,请参阅 :ref:`ALTER TABLE ...<label-alter_table_data_metric_function_action> ` 。

例如:

将数据指标函数计划设置为每 5 分钟运行一次:

ALTER TABLE hr.tables.empl_info SET
  DATA_METRIC_SCHEDULE = '5 MINUTE';
Copy

将数据指标函数计划设置为每天 8:00 AM 运行:

ALTER TABLE hr.tables.empl_info SET
  DATA_METRIC_SCHEDULE = 'USING CRON 0 8 * * * UTC';
Copy

将数据指标函数计划设置为仅在工作日的 8:00 AM 运行:

ALTER TABLE hr.tables.empl_info SET
  DATA_METRIC_SCHEDULE = 'USING CRON 0 8 * * MON,TUE,WED,THU,FRI UTC';
Copy

将数据指标函数计划设置为每天在 0600、1200 和 1800 UTC 时间运行三次:

ALTER TABLE hr.tables.empl_info SET
  DATA_METRIC_SCHEDULE = 'USING CRON 0 6,12,18 * * * UTC';
Copy

将数据指标函数设置为在常规 DML 操作(例如插入新行)修改表时运行:

ALTER TABLE hr.tables.empl_info SET
  DATA_METRIC_SCHEDULE = 'TRIGGER_ON_CHANGES';
Copy

您可以使用 SHOW PARAMETERS 命令查看支持的表对象的 DMF 计划:

SHOW PARAMETERS LIKE 'DATA_METRIC_SCHEDULE' IN TABLE hr.tables.empl_info;
Copy
+----------------------+--------------------------------+---------+-------+------------------------------------------------------------------------------------------------------------------------------+--------+
| 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;
Copy

备注

从修改表的 DMF 开始,会有 10 分钟的滞后,以便任何计划变更对分配给表的先前 DMFs 生效。但是,新分配到表的 DMF 不受 10 分钟延迟的限制。请仔细规划 DMF 计划和 DMF 取消设置操作,以符合您的预期 DMF 成本

此外,当您评估 DMF 结果(如查询 DATA_QUALITY_MONITORING_RESULTS 视图)时,请在查询中指定 measurement_time 列作为评估的基础。DMF 评估由一个内部流程启动,在计划时间和测量时间之间可能会出现表更新(如 INSERT 操作)。使用 measurement_time 列时,可以更准确地评估 DMF 结果,因为测量时间可以指示 DMF 的评估时间。

将 DMF 与表关联

使用 ALTER TABLEALTER VIEW 命令关联 DMF 并指定哪些列作为实参传递。例如,以下命令将系统 DMF NULL_COUNT 与表 t 关联。DMF 执行时,它将返回 c1 列中的 NULL 值的数量。

ALTER TABLE t
  ADD DATA METRIC FUNCTION SNOWFLAKE.CORE.NULL_COUNT
    ON (c1);
Copy

备注

使用 ALTER VIEW 命令在物化视图列上添加 DMF,或从物化视图列中删除 DMF。

从对象中删除 DMF

您可以使用 ALTER TABLE 或 ALTER VIEW 命令删除 DMF。例如:

ALTER TABLE t
  DROP DATA METRIC FUNCTION governance.dmfs.count_positive_numbers
    ON (c1, c2, c3);
Copy

手动调用 DMF

直接调用 DMF 有助于测试 DMF 的输出,然后将其与表或视图关联。

使用以下语法调用 DMF:

SELECT <data_metric_function>(<query>)
Copy

其中:

data_metric_function

指定系统定义或用户定义的 DMF。

query

指定对表或视图进行 SQL 查询。

查询投射的列必须与 DMF 签名中的列实参匹配。

备注

以下系统 DMFs 不遵循此语法,因为它们不采用任何实参:

例如,要调用接受三个列作为实参的自定义 DMF count_positive_numbers,请执行以下命令:

SELECT governance.dmfs.count_positive_numbers(
  SELECT c1, c2, c3
  FROM t);
Copy

例如,要调用 NULL_COUNT(系统数据指标函数) 系统 DMF 以查看 ssn 列中 NULL 值的数量,请执行以下操作:

SELECT SNOWFLAKE.CORE.NULL_COUNT(
  SELECT ssn
  FROM hr.tables.empl_info);
Copy
语言: 中文