借助 Knowledge Catalog(以前称为 Dataplex Universal Catalog),您可以定义和衡量 BigQuery 表和 Iceberg REST Catalog 表中数据的质量。您可以自动扫描数据,根据定义的规则验证数据,并在数据不符合质量要求时记录提醒。借助自动数据质量功能,您可以将数据质量规则和部署作为代码进行管理,从而提高数据生产流水线的完整性。
如需扫描数据以检测异常情况,请参阅 Knowledge Catalog 数据分析扫描。 扫描可以生成数据质量规则。您还可以使用内置的质量规则或构建自定义规则。
Knowledge Catalog 会提供与自动数据质量集成的监控、问题排查和 Cloud Logging 提醒。
概念模型
数据质量扫描是一种 Knowledge Catalog 数据扫描,可根据一组内置规则验证数据。数据扫描是一项 Knowledge Catalog 作业,用于对 BigQuery 和 Cloud Storage(通过 BigQuery 外部表)中的数据进行采样,并推断各种类型的元数据。如需使用自动数据质量来衡量表的质量,请创建类型为 data quality 的 DataScan 对象。扫描仅在一个 BigQuery 表上运行。
扫描使用 Google 租户项目中的资源,因此您无需设置自己的基础设施。
创建和使用数据质量扫描包括以下步骤:
- 定义数据质量规则
- 配置规则执行
- 分析数据质量扫描结果
- 设置监控和提醒
- 排查数据质量失败问题
规则定义
与数据质量扫描关联的数据质量规则定义了数据预期值。您可以通过以下方式创建数据质量规则:
- 使用 Knowledge Catalog 数据分析中的建议
- 使用内置规则或系统规则模板
- 创建自定义 SQL 规则
- 重复使用数据质量规则
内置规则
Knowledge Catalog 支持以下类别的内置规则:
- 行级
对于行级类别规则,系统会根据每个数据行应用预期值。每行都会单独通过或未通过相应条件。例如
column_A_value < 1。行级检查需要您指定通过阈值。当通过规则的行百分比低于阈值时,规则会失败。
- 汇总
对于汇总规则,系统会根据所有数据中汇总的单个值应用预期值。例如:
Avg(someCol) >= 10如需通过检查,检查的计算结果必须为布尔值true。汇总规则不会为每行提供单独的通过或未通过计数。
对于这两种规则类别,您可以设置以下参数:
- 应用规则的列
- 维度
下表列出了受支持的行级规则和汇总规则类型:
| 规则类型 ( Google Cloud 控制台中的名称) |
行级规则或汇总规则 | 说明 | 支持的列类型 | 规则特有的参数 |
|---|---|---|---|---|
RangeExpectation(范围检查) |
行级 | 检查值是否介于最小值和最大值之间。 | 所有数值、日期和时间戳类型列。 | 必需:
|
NonNullExpectation(Null 检查) |
行级 | 验证列值是否不为 NULL。 | 所有受支持的列类型。 | 必需:
|
SetExpectation(设置检查) |
行级 | 检查列中的值是否是集合中指定的值之一。 | 所有受支持的列类型,但 Record 和 Struct 除外。 |
必需:
|
RegexExpectation(正则表达式检查) |
行级 | 根据指定的正则表达式检查值。 | 字符串 | 必需:
|
Uniqueness(唯一性检查) |
汇总 | 检查列中的所有值是否都是唯一的。 | 所有受支持的列类型,但 Record 和 Struct 除外。 |
必需:
|
StatisticRangeExpectation(统计检查) |
汇总 | 检查给定的统计度量是否符合范围预期。 | 所有受支持的数值列类型。 | 必需:
|
支持的自定义 SQL 规则类型
SQL 规则可灵活地使用自定义逻辑来扩展验证。这些规则分为以下类型。
| 规则类型 | 行级规则或汇总规则 | 说明 | 支持的列类型 | 规则特有的参数 | 示例 |
|---|---|---|---|---|---|
| 行条件 | 行级 | 通过在 WHERE 子句中定义 SQL 表达式,为每一行指定预期值。SQL 表达式针对每行的计算结果应为 true(通过)或 false(未通过)。Knowledge Catalog 会计算通过此预期值的行数所占的百分比,并将此值与通过阈值百分比进行比较,以确定规则成功还是失败。 表达式可以添加对另一个表的引用,例如,用于创建参照完整性检查。 |
所有列 | 必需:
|
grossWeight <= netWeight |
| 表条件 (汇总 SQL 表达式) |
汇总 | 系统将为每个表执行一次这些规则。 提供一个计算结果为布尔值 true(通过)或 false(未通过)的 SQL 表达式。SQL 表达式可以使用表达式子查询添加对另一个表的引用。 |
所有列 | 必需:
|
简单的汇总示例:avg(price) > 100使用表达式子查询比较不同表中的值: (SELECT COUNT(*) FROM `example_project.example_dataset.different-table`) < COUNT(*) |
| SQL 断言 | 汇总 | 断言规则使用数据质量查询来查找不符合查询中指定的一个或多个条件的行。提供要评估的 SQL 语句,以返回符合无效状态的行。如果查询返回任何行,则规则会失败。 从 SQL 语句中省略末尾的英文分号。 SQL 语句可以使用表达式子查询添加对另一个表的引用。 |
所有列 | 必需:
|
以下是一个简单的汇总示例,确保 discount_pct 不大于 100:SELECT * FROM example_project.example_dataset.table WHERE discount_pct > 100使用表达式子查询比较不同表中的值: SELECT * FROM `example_project.example_dataset.different-table` WHERE gross_weight > (SELECT avg(gross_weight) FROM `example_project.example_dataset.different-table`)
|
如需查看示例规则,请参阅自动数据质量示例规则。
如需查看支持的 SQL 函数,请参阅 GoogleSQL 参考文档。
重复使用数据质量规则
您可以使用规则模板重用 Knowledge Catalog 数据质量规则,以在多个数据质量规则之间共享复杂或标准化的业务规则定义。例如,您可以创建用于电子邮件验证或两个表之间外键验证的规则模板,然后在数据扫描中重复使用这些模板。
规则可重用性具有以下主要特点:
- 数据质量规则模板:创建自定义规则模板,以存储可在多个数据质量规则之间共享的复杂或标准化业务规则定义。创建
data-quality-rule-template条目并向其添加data-quality-rule-template方面,以定义模板逻辑。 - 将数据规则作为元数据:在 Knowledge Catalog 中将数据质量规则声明为 BigQuery 表或业务术语库术语等条目的切面。使用
data-rules方面类型将这些规则附加到条目。 - 系统规则模板:使用系统规则模板来创建常用规则。
如需了解详情,请参阅重用数据质量规则。
维度
借助维度,您可以汇总多个数据质量规则的结果,以便进行监控和提醒。您必须将每个数据质量规则与一个维度相关联。Knowledge Catalog 提供以下维度:
- 时效性
- 新鲜度用于衡量数据的上次更新时间。有了这些信息,可帮助您确定数据是否足够新,可供使用。
- 数据量
- 数据量用于衡量是否存在所有预期数据。
- 完整性
- 完整性用于评估数据是否包含实现预期用途所需的所有信息。
- 有效期
- 有效性用于评估数据是否符合内置的格式标准、可接受的范围或其他条件。例如,如果有效日期的格式必须为
YYYY/mm/dd,则 08-12-2019 就是无效数据。再举一个例子,如果某商品的有效促销价介于 10 美元和 20 美元之间,则 100 美元的促销价就是无效数据。 - 一致性
- 一致性是指多个实例(例如表和列)中的数据具有相同的值。例如,当从销售数据库或用量数据库读取某个产品的收入时,如果收入不同,就会出现数据不一致的情况。
- 准确率
- 准确性反映了数据的正确性。请注意,有效的数据不一定准确。例如,棕色可能是一种有效的发色,但如果某人不是棕色头发,那么这就是不准确的数据。
- 唯一性
- 唯一性用于衡量数据是否是特有的,没有重复项。
规则中的类型输入
所有值参数都以字符串值的形式传递给 API。Knowledge Catalog 要求输入内容遵循 BigQuery 指定的格式。
二进制类型的参数可以作为 base64 编码的字符串传递。
| 类型 | 支持的格式 | 示例 |
|---|---|---|
| 二进制 | Base64 编码的值 | YXBwbGU= |
| 时间戳 | YYYY-[M]M-[D]D[( |T)[H]H:[M]M:[S]S[.F]] [time_zone] 或 YYYY-[M]M-[D]D[( |T)[H]H:[M]M:[S]S[.F]][time_zone_offset] |
2014-09-27 12:30:00.45-08 |
| 日期 | YYYY-M[M]-D[D] | 2014-09-27 |
| 时间 | [H]H:[M]M:[S]S[.DDDDDD] | 12:30:00.45 |
| DateTime | YYYY-[M]M-[D]D [[H]H:[M]M:[S]S[.DDDDDD]] | 2014-09-27 12:30:00.45 |
数据引用形参
创建自定义 SQL 规则时,您可以使用规则中的数据引用参数 ${data()} 来引用数据源表及其所有前提过滤条件,而无需明确提及源表及其过滤条件。Knowledge Catalog 会将该参数解读为对源表及其过滤条件的引用。前提过滤条件的示例包括行过滤条件、采样百分比和增量过滤条件。
例如,假设您有一个名为 my_project_id.dim_dataset.dim_currency 的数据源表。您想运行增量数据质量扫描,以仅扫描新的每日数据。系统会对表应用一个用于过滤当天的条目的行过滤条件,即 transaction_timestamp >= current_date()。
用于查找当天具有 discount_pct 的行的自定义 SQL 规则如下所示:
discount_pct IN (SELECT discount_pct FROM my_project_id.dim_dataset.dim_currency WHERE transaction_timestamp >= current_date())
如果您使用数据引用参数,则可以简化规则。将提及的表及其前提过滤条件替换为 ${data()} 参数:
discount_pct IN (SELECT discount_pct FROM ${data()})
Knowledge Catalog 将 ${data()} 参数解读为对包含当天条目的数据源表 my_project_id.dim_dataset.dim_currency WHERE transaction_timestamp >= current_date() 的引用。在此示例中,数据引用参数仅引用增量数据。
${data()} 参数区分大小写。
在子查询中使用别名来引用源表中的列时,请使用数据引用参数来引用源表,或省略表引用。请勿在 WHERE 子句中使用直接表引用来引用源表中的列。
推荐:
使用数据引用参数来引用源表:
discount_pct IN ( SELECT discount_pct FROM `my_project_id.dim_dataset.dim_currency` AS temp-table WHERE temp-table.transaction_timestamp = ${data()}.timestamp )省略表引用:
discount_pct IN ( SELECT discount_pct FROM `another_project.another_dataset.another_table` AS temp-table WHERE temp-table.transaction_timestamp = timestamp
不推荐:
请勿使用直接表引用来引用源表中的列:
discount_pct IN ( SELECT discount_pct FROM `my_project_id.dim_dataset.dim_currency` AS temp-table WHERE temp-table.transaction_timestamp = `my_project_id.dim_dataset.dim_currency`.timestamp )
有效使用不同表格:
在比较不同表中的列时,可以使用直接表引用:
discount_pct IN ( SELECT discount_pct FROM `my_project_id.dim_dataset.dim_currency` AS temp-table WHERE temp-table.transaction_timestamp = `another_project.another_dataset.another_table`.timestamp )
调试查询
创建规则时,您可以选择添加一个调试查询,以便与规则一起运行。调试查询是一条 SQL 语句,最多可返回 10 个标量值。如果规则失败,这些值有助于诊断原因。每条规则最多只能添加一个调试查询,且长度不得超过 1024 个字符。
假设有一个针对 example_project.example_dataset.table 表的 SQL 断言规则,用于检查每件商品的平均收入是否超过 100:
SELECT
*
FROM
`example_project.example_dataset.table`
WHERE
SUM(revenue) / COUNT(DISTINCT item_id) > 100
如果上述规则失败,您可以查看总收入、不同商品的数量和每件商品的平均收入等指标,以帮助诊断问题。以下调试查询会返回这些指标:
SELECT
SUM(revenue),
COUNT(DISTINCT item_id),
SUM(revenue) / COUNT(DISTINCT item_id)
FROM `example_project.example_dataset.table`
规则执行
您可以安排数据质量扫描按特定时间间隔运行,也可以按需运行扫描。
执行身份
默认情况下,Knowledge Catalog 使用集中式服务代理 (service-PROJECT_NUMBER@gcp-sa-dataplex.) 运行数据质量扫描。
您可以通过指定自定义服务账号或使用自己的最终用户凭证 (EUC) 来覆盖此默认执行身份。这有以下几点好处:
- 最小权限原则:仅向专用服务账号授予特定数据质量任务所需的精确 IAM 权限,从而最大限度地减少过度预配的访问权限。
- 精细的访问权限控制:将权限限定到特定资源,从而与 BigQuery 中的行级和列级访问权限政策集成。
- 提高了可审核性:为特定扫描分配自定义服务账号或用户凭据,从而在审核日志中更清晰地跟踪和记录活动。
- 结算统一:使用自定义执行身份时,处理和存储费用会直接集中在 BigQuery 下(绕过 Knowledge Catalog Premium SKU)。这样一来,您就可以享受 BigQuery 企业折扣和槽用量承诺。
如需了解如何配置自定义执行身份,请参阅配置执行身份。
网络要求
如需运行扫描,您必须在用于扫描的 VPC 子网上启用专用 Google 访问通道。如果您未指定子网,请确保您的默认子网已启用专用 Google 访问通道。
运行数据质量扫描时,Knowledge Catalog 会创建一个作业。如果作业配置有误或运行时间超出预期,您可以取消作业。
指定数据质量扫描时,您可以将作业的范围指定为以下项之一:
- 完整表
- 每个作业都会验证整个表。
- 增量
- 每个作业都会验证增量数据。如需确定增量,请在表中提供可用作标记的
Date/Timestamp列。通常,这是用于对表进行分区的列。
过滤数据
您可以使用行过滤条件来过滤要扫描的数据,以确保数据质量。创建行过滤条件后,您可以重点关注特定时间段或特定细分(例如特定区域)内的数据。使用过滤条件可以缩短运行时间并降低费用。例如,您可以过滤掉时间戳早于特定日期的数据。
样本数据
您可以指定要采样的数据中记录所占的百分比,以便运行数据质量扫描。对较小的数据示例创建数据质量扫描可以缩短运行时间并降低费用,而查询整个数据集则会增加运行时间和费用。
过滤规则
运行数据质量扫描时,您可以使用 AIP-160 过滤条件语法来选择性地执行特定规则。Knowledge Catalog 会对扫描中定义的规则或通过 data-rules 切面附加到目录条目的规则的元数据执行过滤。
过滤器语法
过滤条件语法遵循 AIP-160 指南。您可以使用标准 AIP-160 运算符(例如 =、!=、>、<、=~),并使用 AND 或 OR 组合多个条件。
使用 AIP-160 过滤条件字符串时,请执行以下操作:
- 在 Google Cloud 控制台中:使用 AIP-160 语法直接输入过滤条件,例如
name = "critical_check"。 - 在 API 调用中:过滤字符串通常是另一个 JSON 字符串字面量中的值。这需要对 AIP-160 字符串中的双引号进行转义。例如
"filter": "name = \"critical_check\""。
可过滤的字段
您可以按规则定义中的大多数字段进行过滤:
name:规则的显示名称。dimension:数据质量维度(例如VALIDITY)。column:规则所适用的列的名称。threshold:规则的通过阈值。ignore_null:一个布尔值。当值为true时,NULL行被视为通过。attributes:分配给规则的自定义键值对。
以下示例展示了常见的过滤条件模式。数值和布尔值不加引号。
按名称过滤
- 完全匹配:
name = "critical_check" - 匹配某种模式:
name =~ "temp_.*"
按维度过滤
- 与特定维度匹配:
dimension = "COMPLETENESS" - 匹配多个维度:
dimension = "VALIDITY" OR dimension = "ACCURACY"
按列和阈值过滤
- 匹配特定列:
column = "user_id" - 匹配阈值:
threshold > 0.95 - 匹配范围:
threshold >= 0.8 AND threshold < 0.9
按 ignore_null 过滤
- 匹配布尔值:
ignore_null = true
按自定义属性过滤
- 检查密钥是否存在:
attributes:environment - 匹配键和值:
attributes.environment = "prod" - 使用正则表达式进行匹配:
attributes.tag =~ "prio-.*" - 匹配组合:
attributes.environment = "prod" AND attributes.criticality = "high"
数据质量扫描结果
数据质量扫描的结果可在 Knowledge Catalog 和 BigQuery 中获得。您还可以使用以下方法查看和分析扫描结果:
将结果导出到 BigQuery
您可以将扫描结果导出到 BigQuery 表中,以供进一步分析。如需自定义报告,您可以将 BigQuery 表数据连接到 Looker 信息中心。您可以通过在多次扫描中使用同一结果表来构建汇总的报告。
将结果作为 Knowledge Catalog 元数据发布
您可以将数据质量扫描结果作为 Knowledge Catalog 元数据发布。最新结果会保存到表示源表的 Knowledge Catalog 条目中,并归入
data-quality-scorecard系统切面类型。您可以在 Google Cloud 控制台中源表的 BigQuery 和 Knowledge Catalog 页面上的数据质量标签页中查看结果。您还可以使用 API 检索结果。如需详细了解 Knowledge Catalog 元数据,请参阅 Knowledge Catalog 中的元数据管理简介。
查看数据质量得分
每个扫描结果都会提供数据质量得分,以指示通过的规则所占的百分比。系统会在总体作业级层、列级层(如果规则是针对列进行评估的)和维度级层报告得分。您可以使用数据质量得分来规范化表或列之间的数据质量、跟踪趋势,并识别不符合质量要求的数据。
如需了解详情,请参阅查看数据质量扫描结果。
监控和提醒
您可以使用以下方法来监控数据质量扫描并接收相关提醒:
在 Cloud Logging 中设置提醒
您可以使用 Logs Explorer 中的
data_scan和data_quality_scan_rule_result日志来监控数据质量作业。对于每个数据质量作业,
data_scan日志(其中data_scan_type字段设置为DATA_QUALITY)包含以下信息:- 用于数据扫描的数据源。
- 作业执行详情,例如创建时间、开始时间、结束时间和作业状态。
- 数据质量作业的结果:通过或未通过。
- 维度级通过或未通过。
每个成功完成的作业都包含一个
data_quality_scan_rule_result日志,其中包含有关该作业中每个规则的以下详细信息:- 配置信息,例如规则名称、规则类型、评估类型和维度。
- 结果信息,例如通过或未通过、总行数、通过的行数、null 行数和评估的行数。
您可以通过 API 和Google Cloud 控制台查看日志中的信息。您可以使用这些信息来设置提醒。如需了解详情,请参阅在 Logging 中设置提醒。
发送邮件通知报告
您可以发送邮件通知报告,以提醒相关人员数据质量作业的状态和结果。通知报告适用于以下场景:
- 数据质量得分低于指定的目标得分
- 作业失败
- 作业已完成
您可以在创建数据质量扫描时配置通知报告。
在 Cloud Billing 中监控 DCU 计算费用
数据质量扫描无服务器计算不会向 Cloud Monitoring 发出时序指标。如需按项目、扫描 ID 或表跟踪和归因数据质量 DCU 费用,请使用
goog-dataplex-datascan-*系统标签在 BigQuery 中查询 Cloud Billing 导出数据。如需了解详情,请参阅通过 Cloud Billing 导出监控和归因 Dataplex DCU 费用。
排查数据质量失败问题
当规则执行失败时,Knowledge Catalog 会提供一个查询来获取失败的记录。运行此查询可查看与您的规则不匹配的记录。如需了解详情,请参阅排查数据质量失败问题。
限制
- gcloud CLI 不支持规则建议。
- 维度选择固定为七个预定义维度之一。
- 每次数据质量扫描的规则数量上限为 1,000。
- API 中仅支持在列级层报告的数据质量得分。
- 您只能对 BigQuery 表、Iceberg REST Catalog 表、SAP Business Data Cloud Delta Lake 表和 Apache Hive 表运行数据质量规则。
价格
- 如需详细了解价格,请参阅 Knowledge Catalog 价格。
- 如需使用 Cloud Billing 导出到 BigQuery 功能来跟踪和归因数据质量扫描 DCU 用量和费用,请参阅使用 Cloud Billing 导出功能监控和归因 Dataplex DCU 费用。
后续步骤
- 了解如何使用自动数据质量。
- 了解如何重复使用数据质量规则。
- 了解如何以代码形式管理数据质量规则。
- 按照教程构建政策即代码数据质量工作流。
- 了解可用于数据分析的 Terraform 资源。请参阅以下内容:
- Terraform 注册表中的 Dataplex 数据扫描资源。
- GitHub 上的 Dataplex 数据扫描资源文档,支持基于 YAML 的规则配置。
- 了解数据分析。
- 了解如何使用数据分析。