

# CustomSQL
<a name="dqdl-rule-types-CustomSql"></a>

此规则类型已扩展为支持两个用例：
+ 针对数据集运行自定义 SQL 语句，并根据给定表达式检查返回值。
+ 运行自定义 SQL 语句，在 SELECT 语句中指定列名，与某个条件进行比较以获得行级结果。

**语法**

```
CustomSql <SQL_STATEMENT> <EXPRESSION>
```
+ **SQL\$1STATEMENT** — 返回单个数值的 SQL 语句，由双引号包围。
+ **EXPRESSION** — 针对规则类型响应运行以生成布尔值的表达式。有关更多信息，请参阅 [Expressions](dqdl.md#dqdl-syntax-rule-expressions)。

**示例：用于检索整体规则结果的自定义 SQL**

此示例规则使用 SQL 语句检索数据集的记录数。然后，该规则检查记录数是否介于 10 到 20 之间。

```
CustomSql "select count(*) from primary" between 10 and 20
```

**示例：用于检索行级结果的自定义 SQL**

此示例规则使用 SQL 语句，在 SELECT 语句中指定列名，与某个条件进行比较以获得行级结果。阈值条件表达式定义了整个规则失败的记录数的阈值。请注意，规则不能同时包含条件和关键字。

```
CustomSql "select Name from primary where Age  > 18"
```

或

```
CustomSql "select Name from primary where Age > 18" with threshold  > 3
```

**重要**  
`primary` 别名代表要评估的数据集的名称。在控制台上处理可视化 ETL 任务时，`primary` 始终表示传递给 `EvaluateDataQuality.apply()` 转换的 `DynamicFrame`。当您使用 AWS Glue 数据目录对表运行数据质量任务时，`primary` 表示该表。

如果您在 AWS Glue Data Catalog 中，也可以使用实际的表名：

```
CustomSql "select count(*) from database.table" between 10 and 20
```

您也可以联接多个表来比较不同的数据元素：

```
CustomSql "select count(*) from database.table inner join database.table2 on id1 = id2" between 10 and 20
```

 在 AWS Glue ETL 中，CustomSQL 可以识别未通过数据质量检查的记录。要使此功能起作用，您需要返回作为您正在评估数据质量的主表一部分的记录。作为查询一部分返回的记录被视为成功，未返回的记录被视为失败。此功能通过连接 CustomSQL 查询的结果与原始数据集来实现。根据 SQL 查询的复杂程度，可能会对性能产生影响。

 要实现此目的，应按照以下步骤进行：
+  您需要从主表中选择至少 1 列。
  +  `select count(*) from primary` 是对 OVERALL CustomSQL DQ 规则的有效查询，但不适用于行级自定义 SQL。
  +  此规则将在评估期间引发错误：`The output from CustomSQL must contain at least one column that matches the input dataset for AWS Glue Data Quality to provide row level results. The SQL query is a valid query but the columns from the SQL result are not present in the Input Dataset. Ensure that matching columns are returned from the SQL.`
+  在 SQL 查询中，从表中选择一个“主键”或选择一组构成复合键的列。如果不这样做，则可能会因匹配重复行而导致结果不一致，并降低性能。
+  仅从主表中选择键，不要从参考表中选择键。

以下规则将确保将年龄小于 100 的记录标识为成功记录，并将超过该年龄的记录标记为失败。

```
CustomSql "select id from primary where age < 100" 
```

当 50% 的记录年龄大于 10 时，此 CustomSQL 规则将通过，并且还将标识失败的记录。此 CustomSQL 返回的记录将被视为通过，而未返回的记录将被视为失败。

```
CustomSQL "select ID, CustomerID from primary where age > 10" with threshold > 0.5
```

注意：如果您返回数据集中不可用的记录，CustomSQL 规则将失败。