使用期望来实施数据质量检查

从数据指标函数 (DMF) 返回值可提供有用的信息,但如果不了解您认为哪些数据是可以接受的,则可能难以判断该值是否表示存在数据质量问题。例如,您可能会将给定列中包含少于 10 个 NULL 值的表视为通过了数据质量检查。在这种情况下,您 期望 该值小于 10,并且仅希望在超过该值时才收到通知。

期望 允许您定义标准,以确定数据是否通过由 DMF 执行的数据质量检查。当 DMF 返回值时,将该值与该标准进行比较,以确定数据是否通过检查。未通过检查的返回值会被报告为违背期望,因此您可以对数据采取适当的措施。

以下内容创建了列 C1 包含少于 10 个 NULL 值的期望。

ALTER VIEW v1
  ADD DATA METRIC FUNCTION SNOWFLAKE.CORE.NULL_COUNT ON (C1)
  EXPECTATION my_exp ( VALUE < 10);
Copy

您可以定义系统 DMFs 和自定义 DMFs 的期望。

定义符合期望的内容

期望包括一个布尔表达式,用于确定是否符合期望。当此表达式的计算结果为 TRUE 时,表示 DMF 结果符合您的期望。

在表达式中,关键字 VALUE 表示 DMF 返回的值。例如,假设您对期望有以下定义:

EXPECTATION my_exp (VALUE < 5)
Copy

Snowflake 在评估期望时将 VALUE 替换为 DMF 返回的值。如果 DMF 返回了 3,则符合期望,因为表达式的计算结果为 TRUE。

如果表达式的计算结果为 FALSE,Snowflake 会将其报告为违背期望。有关跟踪这些违背期望情况的信息,请参阅 识别违背期望的情况

表达式可以包含以下类型的运算符:

表达式不能引用其他表或视图,或用户定义的函数 (UDFs)。

创建期望

DMF 和对象之间的每个关联都可能有一个或多个期望。

在将 DMF 与表或视图关联时可以添加期望,也可以稍后将其添加到关联中。您还可以修改现有的期望。

添加期望后,您可以对其 手动测试,而不必等到 DMF 根据其计划运行。

关联 DMF 时添加期望

您可以使用 ALTER TABLE 或 ALTER VIEW 命令将 DMF 与表或视图关联。您可以在创建关联的同一 SQL 语句中为该关联添加期望。

例如,在将 DMF 与表关联时添加期望的语法如下所示。视图使用类似的语法。此预览版介绍了突出显示的子句。

  ALTER TABLE <table>
    ADD DATA METRIC FUNCTION <dmf>
      ON (<col_name> [ , ... ] [ , TABLE<table_name>( <col_name> [ , ... ] ) )
      [ EXPECTATION <expectation_name> ( <expression> )
        [, <expectation_name> ( <expression> ) [ , ... ] ] ]
Copy

其中:

  • expectation_name 是一个用于标识期望的字符串。只要期望属于不同的关联,就可以使用相同的名称创建期望。

  • expression 是一个布尔表达式,用于确定DMF 是否返回了期望值。请参阅 定义符合期望的内容

示例:添加单个期望

假设您要将 MAX 系统 DMF 与视图 v1 关联,以检查列 c1 中的最大值。您期望最大值介于 25 到 50 之间。

ALTER VIEW v1
  ADD DATA METRIC FUNCTION SNOWFLAKE.CORE.MAX ON (C1)
    EXPECTATION my_exp ( 25 < VALUE AND VALUE < 50);
Copy

如果 MAX DMF 返回的值超出此期望值范围,则 Snowflake 将其记录为违背期望。

示例:添加多个期望

假设您希望在五分钟内未更新表时收到通知,然后在 30 分钟未更新表时再次收到通知。您可以添加以下期望,然后检查何时违背了这些期望。

ALTER TABLE emp
ADD DATA METRIC FUNCTION SNOWFLAKE.CORE.FRESHNESS ON (last_updated)
  EXPECTATION lessThan5Mins (VALUE < 300), lessThan30Mins (VALUE < 1800);
Copy

为现有关联添加期望

您可以使用 ALTER TABLE 或 ALTER VIEW 命令将期望添加到 DMF 和表或视图之间的现有关联中。

例如,为表和 DMF 之间的关联添加期望的语法如下所示。视图使用类似的语法。此预览版介绍了突出显示的子句。

  ALTER TABLE <table>
    MODIFY DATA METRIC FUNCTION <dmf>
      ON (<col_name> [ , ... ] [ , TABLE<table_name>( <col_name> [ , ... ] ) )
      [ ADD EXPECTATION <expectation_name> ( <expression> )
        [, <expectation_name> ( <expression> ) [ , ... ] ] ]
Copy

其中:

  • expectation_name 是一个用于标识期望的字符串。只要期望属于不同的关联,就可以使用相同的名称创建期望。

  • expression 是一个布尔表达式,用于确定DMF 是否返回了期望值。请参阅 定义符合期望的内容

示例

假设您之前已将 NULL_COUNT 系统 DMF 与表 my_table 中的列 c1 关联。要添加期望,以便您在列 c1 中有 10 个或更多 NULL 值时收到通知,请运行以下代码:

ALTER TABLE my_table
  MODIFY DATA METRIC FUNCTION SNOWFLAKE.CORE.NULL_COUNT ON (c1)
    ADD EXPECTATION my_exp (VALUE < 10);
Copy

如果 NULL_COUNT 的结果为 15,则将其报告为违背期望。

修改现有期望

您可以使用 MODIFY EXPECTATION 子句来更改之前添加到关联中的期望表达式。

例如,假设您之前已将期望 my_exp 添加到表 t1 和 NULL_COUNT DMF 之间的关联中。要修改期望,以便在列 c1 中有 15 个或更多 NULL 值时违背期望,请运行以下代码:

ALTER TABLE t1
  MODIFY DATA METRIC FUNCTION SNOWFLAKE.CORE.NULL_COUNT ON (c1)
    MODIFY EXPECTATION my_exp (VALUE < 15);
Copy

之前的期望表达式替换为 VALUE < 15

测试期望

添加期望后,您可以调用 SYSTEM$EVALUATE_DATA_QUALITY_EXPECTATIONS 系统函数来确保正确添加期望,并确定当前是否违背了这些期望。

例如,假设您在 DMF 和表 t1 之间的关联中添加了至少一个期望。要查看当前是否违背了这些期望,请运行以下代码:

SELECT *
  FROM TABLE(SYSTEM$EVALUATE_DATA_QUALITY_EXPECTATIONS(
      REF_ENTITY_NAME => 'my_db.sch.t1'));
Copy

删除期望

使用 DROP EXPECTATION 子句从关联中删除期望并将其从系统中删除。

例如,假设您之前已将期望 my_exp 添加到表 t1 中的列 c1 与 NULL_COUNT DMF 之间的关联中。要从该关联和 DMF 中删除 my_exp,请运行以下代码:

ALTER TABLE t1
  MODIFY DATA METRIC FUNCTION SNOWFLAKE.CORE.NULL_COUNT on (c1)
    DROP EXPECTATION my_exp;
Copy

识别违背期望的情况

您可以使用以下方法识别违背期望的情况:

SNOWFLAKE.LOCAL.DATA_QUALITY_MONITORING_RESULTS_RAW

数据质量结果记录在专用事件表 SNOWFLAKE.LOCAL.DATA_QUALITY_MONITORING_RESULTS_RAW 中。

如果对象和 DMF 之间的关联中包含期望,则每次 Snowflake 计算 DMF 的结果时都会向表中添加两行。第一行记录 DMF 与之关联的对象、DMF 本身以及数据质量检查结果的相关信息。第二行记录与 DMF 关联设定的期望相关的信息,包括是符合了期望还是违背了期望。如果有多个期望,则每个期望都对应一行。

resource_attribute 列中的 snow.data_metric.record_type 字段表示行是否与期望对应。此字段有两个可能的值:

  • EXPECTATION_VIOLATION_STATUS – 表示该行与期望相对应。

  • EVALUATION_RESULT – 表示该行与 DMF 的评估结果相对应。

如果该行与期望相对应,则 resource_attribute 列还包含以下与期望相关的字段:

  • snow.data_metric.expectation_id – 系统生成的标识符。

  • snow.data_metric.expectation_name – 将期望添加到关联中时的期望名称。

  • snow.data_metric.expectation_expression – 期望的表达式。

当您确定某一行与期望的评估结果对应后,可以检查 value 列以确定是否违背了期望。如果为 TRUE,则违背了期望。

DATA_QUALITY_MONITORING_EXPECTATION_STATUS 视图

DATA_QUALITY_MONITORING_EXPECTATION_STATUS 视图 存在于 SNOWFLAKE.LOCAL 架构中,可将事件表中的信息展平,以便更轻松地访问 DMF 结果。

DATA_QUALITY_MONITORING_EXPECTATION_STATUS 函数

DATA_QUALITY_MONITORING_EXPECTATION_STATUS 表函数返回的行提供的信息与 DATA_QUALITY_MONITORING_EXPECTATION_STATUS 视图中提供的信息相同。该函数使用与视图不同的访问控制模型。

跟踪期望的使用情况

Snowflake 会记录账户中的所有期望。您可以 运行函数查询 ACCOUNT_USAGE 视图 来监控期望的使用情况,包括执行以下任务:

  • 监控哪些对象已为其与 DMF 的关联定义了期望。

  • 监控哪些 DMFs 已为其与对象的关联定义了期望。

  • 了解是否为对象和 DMF 之间的特定关联定义了期望。

  • 确定期望的布尔表达式,以更好地理解数据质量检查。

运行函数来跟踪期望

您可以运行 DATA_METRIC_FUNCTION_EXPECTATIONS 函数来输出为特定对象、特定 DMF 或对象与 DMF 之间的关联定义的期望。

示例: 针对特定对象存在的期望

SELECT *
  FROM TABLE(
    INFORMATION_SCHEMA.DATA_METRIC_FUNCTION_EXPECTATIONS(
      REF_ENTITY_NAME => 'my_table',
      REF_ENTITY_DOMAIN => 'table'));
Copy

示例: 针对特定 DMF 存在的期望

SELECT *
  FROM TABLE(
    INFORMATION_SCHEMA.DATA_METRIC_FUNCTION_EXPECTATIONS(
      METRIC_NAME => 'SNOWFLAKE.CORE.NULL_COUNT'));
Copy

示例: 针对对象与 DMF 之间的特定关联存在的期望

SELECT *
  FROM TABLE(
    INFORMATION_SCHEMA.DATA_METRIC_FUNCTION_EXPECTATIONS(
      METRIC_NAME => 'SNOWFLAKE.CORE.NULL_COUNT',
      REF_ENTITY_NAME => 'my_table',
      REF_ENTITY_DOMAIN => 'table'));
Copy

查询视图以跟踪期望

ACCOUNT_USAGE 架构中的 DATA_METRIC_FUNCTION_EXPECTATIONS 视图 包含账户中的所有期望。您可以查询视图以跟踪账户中期望的使用情况,并确定每个期望的布尔表达式。

示例: 返回 Snowflake 账户的所有期望

SELECT * FROM snowflake.account_usage.data_metric_function_expectations
  ORDER BY expectation_name;
Copy

示例: 确定特定数据指标函数的期望

SELECT expectation_name,
    ref_database_name as object_database,
    ref_schema_name as object_schema,
    ref_entity_name as object_name
  FROM snowflake.account_usage.data_metric_function_expectations
  WHERE
    metric_database_name = 'SNOWFLAKE' AND
    metric_schema_name = 'CORE' AND
    metric_name = 'ROW_COUNT'
  ORDER BY expectation_name;
Copy
语言: 中文