

# 数据质量定义语言（DQDL）引用
<a name="dqdl"></a>

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

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

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

**Contents**
+ [DL 语法](#dqdl-syntax)
  + [规则结构](#dqdl-syntax-rule-structure)
  + [复合规则](#dqdl-syntax-rule-composition)
    + [复合规则的工作原理](#dqdl-syntax-composite-rules)
  + [Expressions](#dqdl-syntax-rule-expressions)
    + [NULL、EMPTY 和 WHITESPACE\$1ONLY 的关键字](#dqdl-keywords-null-empty-whitespaces_only)
    + [使用 Where 子句进行筛选](#dqdl-filtering-data-in-dqdl)
  + [常量](#dqdl-constants)
  + [标签](#dqdl-labels)
    + [DQDL 标签的语法](#dqdl-labels-syntax)
      + [标签约束](#dqdl-labels-constraints)
    + [检索 DQDL 标签](#dqdl-labels-retrieving)
      + [规则结果](#dqdl-labels-rule-outcomes)
      + [行级结果](#dqdl-labels-row-level-results)
      + [API 响应](#dqdl-labels-api-response)
  + [动态规则](#dqdl-dynamic-rules)
  + [分析器](#dqdl-analyzers)
  + [评论](#dqdl-syntax-comments)
+ [DL 规则类型引用](dqdl-rule-types.md)
  + [AggregateMatch](dqdl-rule-types-AggregateMatch.md)
  + [列相关性](dqdl-rule-types-ColumnCorrelation.md)
  + [ColumnCount](dqdl-rule-types-ColumnCount.md)
  + [ColumnDataType](dqdl-rule-types-ColumnDataType.md)
  + [ColumnExists](dqdl-rule-types-ColumnExists.md)
  + [ColumnLength](dqdl-rule-types-ColumnLength.md)
  + [ColumnNamesMatchPattern](dqdl-rule-types-ColumnNamesMatchPattern.md)
  + [ColumnValues](dqdl-rule-types-ColumnValues.md)
  + [完整性](dqdl-rule-types-Completeness.md)
  + [CustomSQL](dqdl-rule-types-CustomSql.md)
  + [DataFreshness](dqdl-rule-types-DataFreshness.md)
  + [DatasetMatch](dqdl-rule-types-DatasetMatch.md)
  + [DistinctValuesCount](dqdl-rule-types-DistinctValuesCount.md)
  + [熵](dqdl-rule-types-Entropy.md)
  + [IsComplete](dqdl-rule-types-IsComplete.md)
  + [IsPrimaryKey](dqdl-rule-types-IsPrimaryKey.md)
  + [IsUnique](dqdl-rule-types-IsUnique.md)
  + [平均值](dqdl-rule-types-Mean.md)
  + [ReferentialIntegrity](dqdl-rule-types-ReferentialIntegrity.md)
  + [RowCount](dqdl-rule-types-RowCount.md)
  + [RowCountMatch](dqdl-rule-types-RowCountMatch.md)
  + [StandardDeviation](dqdl-rule-types-StandardDeviation.md)
  + [总和](dqdl-rule-types-Sum.md)
  + [SchemaMatch](dqdl-rule-types-SchemaMatch.md)
  + [独特性](dqdl-rule-types-Uniqueness.md)
  + [UniqueValueRatio](dqdl-rule-types-UniqueValueRatio.md)
  + [DetectAnomalies](dqdl-rule-types-DetectAnomalies.md)
  + [FileFreshness](dqdl-rule-types-FileFreshness.md)
  + [FileMatch](dqdl-rule-types-FileMatch.md)
  + [FileUniqueness](dqdl-rule-types-FileUniqueness.md)
  + [FileSize](dqdl-rule-types-FileSize.md)

## DL 语法
<a name="dqdl-syntax"></a>

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

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

### 规则结构
<a name="dqdl-syntax-rule-structure"></a>

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

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

`RuleType` 是要配置的规则类型的区分大小写名称。例如，`IsComplete`、`IsUnique` 或 `CustomSql`。每种规则类型的规则参数都不同。有关 DQDL 规则类型及其参数的完整参考，请参阅[DL 规则类型引用](dqdl-rule-types.md)。

### 复合规则
<a name="dqdl-syntax-rule-composition"></a>

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

**and**  
当且仅当逻辑 `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"))
```

您还可以编写更复杂的嵌套规则。

```
(RowCount > 0) or ((IsComplete "colA") and (IsUnique "colA"))
```

#### 复合规则的工作原理
<a name="dqdl-syntax-composite-rules"></a>

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

```
# 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 中，您可以在用户界面中轻松配置此选项，如下所示。

![\[屏幕截图显示了一个“复合规则设置”窗口，您可以在其中选择行和列之间的规则评估配置。如果选择“行”，复合规则将作为评估整行的单个规则运行。如果选择“列”，则复合规则将评估整个数据集中的各个规则，然后将结果合并。\]](http://docs.amazonaws.cn/glue/latest/dg/images/composite-rule-settings.png)


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

```
# 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
<a name="dqdl-syntax-rule-expressions"></a>

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

```
Mean "colA" between 80 and 100
```

某些规则类型（例如 `IsUnique` 和 `IsComplete`）已经返回布尔响应。

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


**支持的 DQDL 表达式**  

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

#### NULL、EMPTY 和 WHITESPACE\$1ONLY 的关键字
<a name="dqdl-keywords-null-empty-whitespaces_only"></a>

 如果要验证字符串列是否为零、空或属于仅包含空格的字符串，则可以使用以下关键字：
+  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\$1ONLY /whitespaces\$1only – 对于字符串列中只有空格（“ ”）值的字符串，此关键字解析为 true。

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

   支持的规则：
  +  [ColumnValues](https://docs.amazonaws.cn/glue/latest/dg/dqdl.html#dqdl-rule-types-ColumnValues) 

 对于基于数值或日期的表达式，如果要验证列是否包含零值，则可以使用以下关键字。
+  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”选项。*

   支持的规则：
  +  [ColumnValues](https://docs.amazonaws.cn/glue/latest/dg/dqdl.html#dqdl-rule-types-ColumnValues) 

#### 使用 Where 子句进行筛选
<a name="dqdl-filtering-data-in-dqdl"></a>

**注意**  
 仅 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 |  | 

### 常量
<a name="dqdl-constants"></a>

 在 DQDL 中，您可以定义常量值并在整个脚本中引用这些值。这有助于防止与查询大小限制相关的问题，例如，在处理可能超出允许范围的大型 SQL 语句时。通过将这些值分配给常量，可以简化 DQDL 并避免达到这些限制。

 以下示例演示了如何定义并使用常量：

```
mySql = "select count(*) from primary"

Rules = [
    CustomSql $mySql between 0 and 100
]
```

 在此示例中，将 SQL 查询分配给常量 `mySql`，然后使用 `$` 前缀在规则中引用该常量。

### 标签
<a name="dqdl-labels"></a>

 标签为组织和分析数据质量结果提供了一种有效的方法。可以按特定标签查询结果，进而识别特定类别中的失败规则，按团队或域统计规则结果，并为不同的利益相关者创建有针对性的报告。

 例如，可以使用标签 `"team=finance"` 应用与财务团队有关的所有规则，并生成自定义报告来展示财务团队特定的质量指标。可以将高优先级规则标注为 `"criticality=high"`，进而确定补救工作的优先级。标签可以作为 DQDL 的一部分创作。可以将标签作为规则结果、行级结果和 API 响应的一部分进行查询，从而轻松地与现有的监控和报告工作流程集成。

**注意**  
 标签仅在 Amazon Glue ETL 中可用，在基于 Amazon Glue Data Catalog 的数据质量自动监测功能中不可用。

#### DQDL 标签的语法
<a name="dqdl-labels-syntax"></a>

 DQDL 支持默认标签和特定于规则的标签。默认标签是在规则集级别定义的，并自动应用于该规则集中的所有规则。各个规则也可以有自己的标签，并且由于标签是作为键值对实现的，因此在使用相同的键时，特定于规则的标签可以覆盖默认标签。

 以下示例演示了如何使用默认和特定于规则的标签：

```
DefaultLabels=["frequency"="monthly"]

Rules = [
    // Auto includes the default label ["frequency"="monthly"]
    ColumnValues "col" > 21,
    // Add ["foo"="bar"] to default label. Labels for this rule would be ["frequency"="monthly", "foo"="bar"]
    Rule 1 with threshold > 0.8 labels=["foo"="bar"],
    // Override default label. Labels for this rule would be ["frequency"="daily", "foo"="bar"]
    Rule 2 with threshold > 0.8 labels=["foo"="bar", "frequency"="daily"]
    // Labels must be applied to the entire composite rule (parentheses required)
    (Rule 1 AND Rule 2) labels=["foo"="bar]
]
```

##### 标签约束
<a name="dqdl-labels-constraints"></a>

 标签具有以下约束：
+ 每个 DQDL 规则最多有 10 个标签。
+ 标签被指定为键值对列表。
+ 标签键和标签值区分大小写。
+ 标签键的最大长度是 128 个字符。标签键不得为空或为 null。
+ 标签值的最大长度是 256 个字符。标签值可以为空或为 null。

#### 检索 DQDL 标签
<a name="dqdl-labels-retrieving"></a>

 可以从规则结果、行级结果和 API 响应中检索 DQDL 标签。

##### 规则结果
<a name="dqdl-labels-rule-outcomes"></a>

 DQDL 标签在规则结果中始终可见。无需额外配置即可启用这些标签。

##### 行级结果
<a name="dqdl-labels-row-level-results"></a>

 默认情况下，行级结果中的 DQDL 标签处于禁用状态，但可以使用 `EvaluateDataQuality` 中的 `AdditionalOptions` 启用。

 以下示例演示了如何在行级结果中启用标签：

```
val evaluateResult = EvaluateDataQuality.processRows(
    frame=AmazonS3_node1754591511068,
    ruleset=example_ruleset,
    publishingOptions=JsonOptions("""{
        "dataQualityEvaluationContext": "evaluateResult",
        "enableDataQualityCloudWatchMetrics": "true",
        "enableDataQualityResultsPublishing": "true"
    }"""),
    additionalOptions=JsonOptions("""{
        "performanceTuning.caching":"CACHE_NOTHING",
        "observations.scope":"ALL",
        "rowLevelConfiguration.ruleWithLabels":"ENABLED"
    }""")
)
```

 启用后，行级结果数据框将包含 `DataQualityRulesPass`、`DataQualityRulesFail` 和 `DataQualityRulesSkip` 列中每条规则的标签。

##### API 响应
<a name="dqdl-labels-api-response"></a>

 DQDL 标签在 API 响应中 `RuleResults` 对象的新字段 `Labels` 下始终可见。

 以下示例演示了 API 响应中的标签：

```
{
    "ResultId": "dqresult-example",
    "ProfileId": "dqprofile-example",
    "Score": 0.6666666666666666,
    "RulesetName": "EvaluateDataQuality_node1754591514205",
    "EvaluationContext": "EvaluateDataQuality_node1754591514205",
    "StartedOn": "2025-08-22T19:36:10.448000+00:00",
    "CompletedOn": "2025-08-22T19:36:16.368000+00:00",
    "JobName": "anniezc-test-labels",
    "JobRunId": "jr_068f6d7a45074d9105d14e4dee09db12c3b95664b45f6ee44fa29ed7e5619ba8",
    "RuleResults": [
        {
            "Name": "Rule_0",
            "Description": "IsComplete colA",
            "EvaluationMessage": "Input data does not include column colA!",
            "Result": "FAIL",
            "EvaluatedMetrics": {},
            "EvaluatedRule": "IsComplete colA",
            "Labels": {
                "frequency": "monthly"
            }
        },
        {
            "Name": "Rule_1",
            "Description": "Rule 1 with threshold > 0.8",
            "Result": "PASS",
            "EvaluatedMetrics": {},
            "EvaluatedRule": "Rule 1 with threshold > 0.8",
            "Labels": {
                "frequency": "monthly",
                "foo": "bar"
            }
        },
        {
            "Name": "Rule_3",
            "Description": "Rule 2 with threshold > 0.8",
            "Result": "PASS",
            "EvaluatedMetrics": {},
            "EvaluatedRule": "Rule 2 with threshold > 0.8",
            "Labels": {
                "frequency": "daily",
                "foo": "bar"
            }
        }
    ]
}
```

### 动态规则
<a name="dqdl-dynamic-rules"></a>

**注意**  
动态规则仅在 Amazon Glue ETL 中受支持，在 Amazon Glue Data Catalog 中不受支持。

 现在，您可以编写动态规则，将规则生成的当前指标与其历史值进行比较。这些历史比较通过在表达式中使用 `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`

 大多数具有数字条件或阈值的规则类型都支持动态规则；请参阅提供的[分析器和规则](#dqdl-analyzers-table)表，以确定您的规则类型是否支持动态规则。

 **从动态规则中排除统计信息** 

 有时，您需要从动态规则计算中排除数据统计信息。假设您加载了历史数据，但不希望其影响您的平均值。为此，请在 Amazon Glue ETL 中打开作业并选择**数据质量**选项卡，然后依次选择**统计信息**和要排除的统计信息。您将能够看到趋势图和统计表。选择要排除的值，然后选择**排除统计信息**。排除的统计信息将不会包含在动态规则计算中。

![\[屏幕截图显示选择统计信息后从下拉菜单中排除或包含统计信息的选项。\]](http://docs.amazonaws.cn/glue/latest/dg/images/data-quality-excluding-statistics-from-dynamic-rules.png)


### 分析器
<a name="dqdl-analyzers"></a>

**注意**  
 Amazon Glue Data Catalog 不支持分析器。

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

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


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

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

 可以在规则集的 `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 | 计算以下统计信息：[\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/glue/latest/dg/dqdl.html)  | 

### 评论
<a name="dqdl-syntax-comments"></a>

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

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