数据质量定义语言(DQDL)引用 - Amazon 连接词
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

数据质量定义语言(DQDL)引用

数据质量定义语言(DQDL)是一种特定领域的语言,用于定义 Amazon Glue Data Quality 规则。

本指南介绍了关键的 DQDL 概念,以帮助您理解该语言。它还通过语法和示例为 DQDL 规则类型提供了参考。在使用本指南之前,我们建议您熟悉 Amazon Glue Data Quality。有关更多信息,请参阅 Amazon Glue Data Quality

注意

只有 Amazon Glue ETL 支持动态规则。

DL 语法

DQDL 文档区分大小写,并包含一个规则集,该规则集将各个数据质量规则组合在一起。要构造规则集,必须创建一个名为 Rules(大写)的列表,由一对方括号分隔。该列表应包含一个或多个以逗号分隔的 DQDL 规则,如下例所示。

Rules = [ IsComplete "order-id", IsUnique "order-id" ]

规则结构

DQDL 规则的结构取决于规则类型。但是,DQDL 规则通常符合以下格式。

<RuleType> <Parameter> <Parameter> <Expression>

RuleType 是要配置的规则类型的区分大小写名称。例如,IsCompleteIsUniqueCustomSql。每种规则类型的规则参数都不同。有关 DQDL 规则类型及其参数的完整参考,请参阅DL 规则类型引用

复合规则

DQDL 支持以下逻辑运算符,您可以使用这些运算符来组合规则。这些规则被称为复合规则。

以及

当且仅当逻辑 and 运算符连接的规则为 true,逻辑运算符才会产生结果 true。否则,组合规则将导致 false。与 and 运算符连接的每条规则都必须用圆括号括起来。

以下示例使用 and 运算符将两个 DL 规则组合。

(IsComplete "id") and (IsUnique "id")
或者

当且仅当逻辑 or 运算符连接的一个或多个规则为 true,逻辑运算符才会产生结果 true。与 or 运算符连接的每条规则都必须用圆括号括起来。

以下示例使用 or 运算符将两个 DL 规则组合。

(RowCount "id" > 100) or (IsPrimaryKey "id")

您可以使用同一个运算符连接多个规则,因此允许使用以下规则组合。

(Mean "Star_Rating" > 3) and (Mean "Order_Total" > 500) and (IsComplete "Order_Id")

但是,您不能将逻辑运算符组合成一个表达式。例如,不允许以下组合。

(Mean "Star_Rating" > 3) and (Mean "Order_Total" > 500) or (IsComplete "Order_Id")

复合规则的工作原理

默认情况下,复合规则将作为整个数据集或表中的单个规则进行评估,然后合并结果。换句话说,它会首先评估整列,然后应用运算符。下面举例说明这种默认行为:

# Dataset +------+------+ |myCol1|myCol2| +------+------+ | 2| 1| | 0| 3| +------+------+ # Overall outcome +----------------------------------------------------------+-------+ |Rule |Outcome| +----------------------------------------------------------+-------+ |(ColumnValues "myCol1" > 1) OR (ColumnValues "myCol2" > 2)|Failed | +----------------------------------------------------------+-------+

在上面的示例中,Amazon Glue Data Quality 会首先评估会导致失效的 (ColumnValues "myCol1" > 1)。然后它将评估同时也会出现失效的 (ColumnValues "myCol2" > 2)。两个结果的组合将被标记为 FAILED。

但是,如果您更喜欢与 SQL 类似的行为,即需要评估整行,则必须显式设置 ruleEvaluation.scope 参数,如下面代码片段中的 additionalOptions 所示。

object GlueApp { val datasource = glueContext.getCatalogSource( database="<db>", tableName="<table>", transformationContext="datasource" ).getDynamicFrame() val ruleset = """ Rules = [ (ColumnValues "age" >= 26) OR (ColumnLength "name" >= 4) ] """ val dq_results = EvaluateDataQuality.processRows( frame=datasource, ruleset=ruleset, additionalOptions=JsonOptions(""" { "compositeRuleEvaluation.method":"ROW" } """ ) ) }

在 Amazon Glue Data Catalog 中,您可以在用户界面中轻松配置此选项,如下所示。

屏幕截图显示了一个“复合规则设置”窗口,您可以在其中选择行和列之间的规则评估配置。如果选择“行”,复合规则将作为评估整行的单个规则运行。如果选择“列”,则复合规则将评估整个数据集中的各个规则,然后将结果合并。

设置完成后,复合规则将作为评估整行的单个规则运行。以下示例说明了此行为。

# Row Level outcome +------+------+------------------------------------------------------------+---------------------------+ |myCol1|myCol2|DataQualityRulesPass |DataQualityEvaluationResult| +------+------+------------------------------------------------------------+---------------------------+ |2 |1 |[(ColumnValues "myCol1" > 1) OR (ColumnValues "myCol2" > 2)]|Passed | |0 |3 |[(ColumnValues "myCol1" > 1) OR (ColumnValues "myCol2" > 2)]|Passed | +------+------+------------------------------------------------------------+---------------------------+

此功能不支持某些规则,因为其总体结果依赖阈值或比率。不支持的规则列举如下。

依赖比率的规则:

  • 完整性

  • DatasetMatch

  • ReferentialIntegrity

  • 独特性

依赖阈值的规则:

当以下规则包含阈值时,则不支持这些规则。但是,不涉及 with threshold 的规则仍受支持。

  • ColumnDataType

  • ColumnValues

  • CustomSQL

Expressions

如果规则类型不生成布尔响应,则必须提供表达式作为参数才能创建布尔响应。例如,以下规则根据表达式检查列中所有值的均值(平均值),以返回真或假结果。

Mean "colA" between 80 and 100

某些规则类型(例如 IsUniqueIsComplete)已经返回布尔响应。

下表列出了您可在 DL 规则中使用的表达式。

支持的 DQDL 表达式
Expression 描述 示例
=x 如果规则类型响应等于 x,则解析为 true
Completeness "colA" = "1.0", ColumnValues "colA" = "2022-06-30"
!=x x 如果规则类型响应不等于 x,则解析为 true。
ColumnValues "colA" != "a", ColumnValues "colA" != "2022-06-30"
> x 如果规则类型响应大于 x,则解析为 true
ColumnValues "colA" > 10
< x 如果规则类型响应小于 x,则解析为 true
ColumnValues "colA" < 1000, ColumnValues "colA" < "2022-06-30"
>= x 如果规则类型响应大于 x,则解析为 true
ColumnValues "colA" >= 10
<= x 如果规则类型响应小于或等于 x,则解析为 true
ColumnValues "colA" <= 1000
介于 x y 之间 如果规则类型响应在指定范围内(不包括),则解析为 true。仅将此表达式类型用于数字和日期类型。
Mean "colA" between 8 and 100, ColumnValues "colA" between "2022-05-31" and "2022-06-30"
not between x and y 如果规则类型响应不在指定范围内(包括首尾数),则解析为 true。您只能将此表达式类型用于数字和日期类型。
ColumnValues "colA" not between "2022-05-31" and "2022-06-30"
在 [a, b, c, ...] 中 如果规则类型响应在指定的集合中,则解析为 true
ColumnValues "colA" in [ 1, 2, 3 ], ColumnValues "colA" in [ "a", "b", "c" ]
not in [a, b, c, ...] 如果规则类型响应不在指定的集合中,则解析为 true
ColumnValues "colA" not in [ 1, 2, 3 ], ColumnValues "colA" not in [ "a", "b", "c" ]
匹配 /ab+c/i 如果规则类型响应与正则表达式匹配,则解析为 true
ColumnValues "colA" matches "[a-zA-Z]*"
not matches /ab+c/i 如果规则类型响应与正则表达式不匹配,则解析为 true
ColumnValues "colA" not matches "[a-zA-Z]*"
now() 仅适用于创建日期表达式的 ColumnValues 规则类型。
ColumnValues "load_date" > (now() - 3 days)
matches/in […]/not matches/not in [...] with threshold 指定符合规则条件的值的百分比。仅适用于 ColumnValuesColumnDataTypeCustomSQL 规则类型。
ColumnValues "colA" in ["A", "B"] with threshold > 0.8, ColumnValues "colA" matches "[a-zA-Z]*" with threshold between 0.2 and 0.9 ColumnDataType "colA" = "Timestamp" with threshold > 0.9

NULL、EMPTY 和 WHITESPACE_ONLY 的关键字

如果要验证字符串列是否为零、空或属于仅包含空格的字符串,则可以使用以下关键字:

  • NULL/null – 对于字符串列中的 null 值,此关键字解析为 true。

    如果超过 50% 的数据没有零值,则 ColumnValues "colA" != NULL with threshold > 0.5 将返回 true。

    对于所有具有零值或长度大于 5 的行,(ColumnValues "colA" = NULL) or (ColumnLength "colA" > 5) 都将返回 true。请注意,这将需要使用“compositeRuleEvaluation.method” = “ROW”选项。

  • EMPTY/empty – 对于字符串列中的空字符串(“”)值,此关键字将解析为 true。某些数据格式会将字符串列中的零值转换为空字符串。此关键字有助于过滤掉数据中的空字符串。

    如果一行为空、“a”或“b”,(ColumnValues "colA" = EMPTY) or (ColumnValues "colA" in ["a", "b"]) 将返回 true。请注意,这需要使用“compositeRuleEvaluation.method” = “ROW”选项。

  • WHITESPACES_ONLY /whitespaces_only – 对于字符串列中只有空格(“ ”)值的字符串,此关键字解析为 true。

    如果一行既不是“a”或“b”,也不只是空格,ColumnValues "colA" not in ["a", "b", WHITESPACES_ONLY] 将返回 true。

    支持的规则:

对于基于数值或日期的表达式,如果要验证列是否包含零值,则可以使用以下关键字。

  • NULL/null – 对于字符串列中的零值,此关键字解析为 true。

    如果列中的日期为 2023-01-01 或零,ColumnValues "colA" in [NULL, "2023-01-01"] 将返回 true。

    对于所有具有零值或值介于 1 到 9 之间的行,(ColumnValues "colA" = NULL) or (ColumnValues "colA" between 1 and 9) 都将返回 true。请注意,这将需要使用“compositeRuleEvaluation.method” = “ROW”选项。

    支持的规则:

使用 Where 子句进行筛选

注意

仅 Amazon Glue 4.0 中支持 Where 子句。

您可以在编写规则时筛选数据。当您想要应用条件规则时,这会很有用。

<DQDL Rule> where "<valid SparkSQL where clause> "

必须使用 where 关键字指定筛选条件,后跟一个用引号 ("") 括起有效 SparkSQL 语句。

如果您希望将 where 子句添加到具有阈值的规则中,则应在指定阈值条件之前指定 where 子句。

<DQDL Rule> where "valid SparkSQL statement>" with threshold <threshold condition>

您可以使用此语法编写如下规则。

Completeness "colA" > 0.5 where "colB = 10" ColumnValues "colB" in ["A", "B"] where "colC is not null" with threshold > 0.9 ColumnLength "colC" > 10 where "colD != Concat(colE, colF)"

我们将验证所提供的 SparkSQL 语句是否有效。如果无效,规则评估将失败,我们将按照以下格式引发 IllegalArgumentException

Rule <DQDL Rule> where "<invalid SparkSQL>" has provided an invalid where clause : <SparkSQL Error>

启用行级错误记录识别时的 where 子句行为

借助 Amazon Glue 数据质量自动监测功能,您可以识别失败的特定记录。将 where 子句应用于支持行级结果的规则时,我们会将 where 子句筛选出的行标记为 Passed

如果您希望将筛选出的行单独标记为 SKIPPED,则可以为 ETL 作业设置以下 additionalOptions

object GlueApp { val datasource = glueContext.getCatalogSource( database="<db>", tableName="<table>", transformationContext="datasource" ).getDynamicFrame() val ruleset = """ Rules = [ IsComplete "att2" where "att1 = 'a'" ] """ val dq_results = EvaluateDataQuality.processRows( frame=datasource, ruleset=ruleset, additionalOptions=JsonOptions(""" { "rowLevelConfiguration.filteredRowLabel":"SKIPPED" } """ ) ) }

请参阅以下规则和数据框作为示例:

IsComplete att2 where "att1 = 'a'"
id att1 att2 行级结果(默认) 行级结果(跳过的选项) 注释
1 a f PASSED PASSED
2 b d PASSED SKIPPED 行已被筛选出,因为 att1 不是 "a"
3 a null FAILED FAILED
4 a f PASSED PASSED
5 b null PASSED SKIPPED 行已被筛选出,因为 att1 不是 "a"
6 a f PASSED PASSED

动态规则

现在,您可以编写动态规则,将规则生成的当前指标与其历史值进行比较。这些历史比较通过在表达式中使用 last() 运算符启用。例如,当前运行中的行数大于同一数据集之前最近一次的行数时,RowCount > last() 规则就会成功。last() 采用一个可选的自然数参数,描述要考虑的先前指标数量;k >= 1 将引用的最后一个 k 指标 last(k)

  • 如果没有可用的数据点,last(k) 将返回默认值 0.0。

  • 如果少于可用的 k 指标,则 last(k) 将返回所有之前的指标。

要形成有效的表达式,请使用 last(k),其中 k > 1 需要聚合函数以将多个历史结果简化为单个数字。例如,RowCount > avg(last(5)) 将检查当前数据集的行数是否严格大于同一数据集最后五行计数的平均值。RowCount > last(5) 将产生错误,因为无法将当前数据集的行数与列表进行有意义的比较。

支持的聚合函数:

  • avg

  • median

  • max

  • min

  • sum

  • std(标准偏差)

  • abs(绝对值)

  • index(last(k), i) 将允许从最后一个 k 中选择第 i 最新的值。i 为零索引,因此 index(last(3), 0) 将返回最新的数据点,并且 index(last(3), 3) 将导致错误,因为只有三个数据点,而我们尝试编制第四最新数据点的索引。

示例表达式

ColumnCorrelation

  • ColumnCorrelation "colA" "colB" < avg(last(10))

DistinctValuesCount

  • DistinctValuesCount "colA" between min(last(10))-1 and max(last(10))+1

大多数具有数字条件或阈值的规则类型都支持动态规则;请参阅提供的分析器和规则表,以确定您的规则类型是否支持动态规则。

分析器

注意

Amazon Glue Data Catalog 不支持分析器。

DQDL 规则使用名为分析器的功能收集有关您的数据的信息。规则的布尔表达式使用此信息确定规则应该成功还是失败。例如,RowCount 规则 RowCount > 5 将使用行计数分析器发现数据集中的行数,并将其与表达式 > 5 进行比较,以检查当前数据集中是否存在超过五行。

有时,我们建议创建分析器(而不是编写规则),然后让其生成可用于检测异常的统计信息。对于此类实例,您可以创建分析器。分析器在以下方面与规则不同。

特征 分析器 规则
规则集的一部分
生成统计信息
生成观测值
可以评估和断言条件
您可以配置操作,例如在失败时停止作业、继续处理作业

分析器无需规则即可独立存在,因此您可以快速配置分析器并逐步构建数据质量规则。

可以在规则集的 Analyzers 块中输入某些规则类型,以运行分析器所需的规则并收集信息,而无需对任何条件进行检查。有些分析器与规则无关,只能在 Analyzers 块中输入。下表显示每个项目是作为规则还是作为独立分析器支持,以及每种规则类型的其他详细信息。

带分析器的示例规则集

以下规则集使用:

  • 一条动态规则,用于检查数据集在过去三次作业运行中,是否增长超过其尾随平均值

  • DistinctValuesCount 分析器,用于记录数据集 Name 列中不同值的数量

  • ColumnLength 分析器,用于跟踪一段时间内最小和最大 Name 大小

可以在作业运行的“数据质量”选项卡中,查看分析器指标结果。

Rules = [ RowCount > avg(last(3)) ] Analyzers = [ DistinctValuesCount "Name", ColumnLength "Name" ]

Amazon Glue 数据质量自动监测功能支持以下分析器。

分析器名称 功能
RowCount 计算数据集的行数
Completeness 计算列的完整性百分比
Uniqueness 计算列的唯一性百分比
Mean 计算数字列的平均值
Sum 计算数字列的总和
StandardDeviation 计算数字列的标准差
Entropy 计算数字列的熵
DistinctValuesCount 计算列中独特值的数量
UniqueValueRatio 计算列中的唯一值比率
ColumnCount 计算数据集中的列数
ColumnLength 计算列的长度
ColumnValues 计算数字列的最小值和最大值。计算非数字列的最小列长和最大列长
ColumnCorrelation 计算给定列的列相关性
CustomSql 计算 CustomSQL 返回的统计信息
AllStatistics 计算以下统计信息:
  • RowCount、ColumnCount

  • 每一列:Completeness、uniqueness

  • 数值:Min、Max、Entropy、Mean、Standard Dev、Sum

  • 字符串:MinLength、MaxLength

注释

您可以使用“#”字符在 DQDL 文档中添加注释。DQDL 会忽略在“#”字符之后以及直到行尾的任何内容。

Rules = [ # More items should generally mean a higher price, so correlation should be positive ColumnCorrelation "price" "num_items" > 0 ]