

# 对 AWS Glue Data Quality 错误进行故障排除
<a name="data-quality-trouble"></a>

如果您在 AWS Glue Data Quality 中遇到错误，则可以使用以下解决方案来帮助您查找问题的根源并解决问题。

**Contents**
+ [错误：缺少 AWS Glue Data Quality 模块](#data-quality-trouble-error-1)
+ [错误：AWS Lake Formation 权限不足](#data-quality-trouble-error-2)
+ [错误：规则集的名称不唯一](#data-quality-trouble-error-3)
+ [错误：带有特殊字符的表](#data-quality-trouble-error-4)
+ [错误：规则集过大时发生溢出错误](#data-quality-trouble-error-5)
+ [错误：整体规则状态为失败](#data-quality-trouble-error-6)
+ [AnalysisException：无法验证默认数据库是否存在](#data-quality-trouble-error-7)
+ [错误消息：提供的键映射不适用于给定的数据帧](#data-quality-trouble-error-8)
+ [用户类中的异常：java.lang.RuntimeException：无法获取数据。请查看 CloudWatch 中的日志以获取更多详细信息](#data-quality-trouble-error-9)
+ [启动错误：从 S3 下载存储桶时出错](#data-quality-trouble-error-10)
+ [InvalidInputException（状态：400）：无法解析 DataQuality 规则](#data-quality-trouble-error-11)
+ [错误：Eventbridge 没有根据我设置的计划触发 Glue DQ 作业](#data-quality-trouble-error-12)
+ [CustomSQL 错误](#data-quality-trouble-error-13)
+ [动态规则](#data-quality-trouble-error-14)
+ [用户类中的常：org.apache.spark.sql.AnalysisException: org.apache.hadoop.hive.ql.metadata.HiveException](#data-quality-trouble-error-15)
+ [UNCLASSIFIED\_ERROR; IllegalArgumentException: Parsing Error: No rules or analyzers provided., no viable alternative at input](#data-quality-trouble-error-16)

## 错误：缺少 AWS Glue Data Quality 模块
<a name="data-quality-trouble-error-1"></a>

**错误消息**：没有名为“awsgluedq”的模块。

**解决方法**：当您在不支持的版本中运行 AWS Glue Data Quality 时，就会发生此错误。AWS仅有 Glue 版本 3.0 和更高版本支持 Glue Data Quality。

## 错误：AWS Lake Formation 权限不足
<a name="data-quality-trouble-error-2"></a>

**错误消息**：用户类异常：`com.amazonaws.services.glue.model.AccessDeniedException`impact\_sdg\_involvement 上的 Lake Formation 权限不足（服务：AWS Glue；状态码：400；错误代码：AccessDeniedException；请求 ID：465ae693-b7ba-4df0-a4e4-6b17xxxxxxxx;；代理：空）。

**解决方法**：您必须在 AWS Lake Formation 中提供足够的权限。

## 错误：规则集的名称不唯一
<a name="data-quality-trouble-error-3"></a>

**错误消息**：用户类中存在异常：...services.glue.model.AlreadyExistsException：另一个同名的规则集已经存在。

**解决方法**：规则集是全局的并且必须是唯一的。

## 错误：带有特殊字符的表
<a name="data-quality-trouble-error-4"></a>

**错误消息**：用户类异常：org.apache.spark.sql.AnalysisException：无法解析''C''给定输入列：[primary.data\_end\_time, primary.data\_start\_time, primary.end\_time, primary.last\_updated, primary.message, primary.process\_date, primary.rowhash, primary.run\_by, primary.run\_id, primary.start\_time, primary.status]；line 1 pos 44;.

**解决方法**：目前存在一个限制，即无法在带有特殊字符（例如“.”）的表上执行 AWS Glue Data Quality。

## 错误：规则集过大时发生溢出错误
<a name="data-quality-trouble-error-5"></a>

**错误消息**：用户类异常：java.lang.StackOverflowError。

**解决方法**：如果您的大型规则集大于 2K 规则，则可能会遇到此问题。将您的规则分解为多个规则集。

## 错误：整体规则状态为失败
<a name="data-quality-trouble-error-6"></a>

**错误条件**：我的规则集已成功，但我的整体规则状态为失败。

**解决方法**：此错误很可能是因为您在发布时选择了将指标发布到 Amazon CloudWatch 的选项。如果您的数据集位于 VPC 中，则您的 VPC 可能不允许 AWS Glue 向 Amazon CloudWatch 发布指标。在这种情况下，您必须为自己的 VPC 设置一个端点才能访问 Amazon CloudWatch。

## AnalysisException：无法验证默认数据库是否存在
<a name="data-quality-trouble-error-7"></a>

 **错误条件**：AnalysException：无法验证默认数据库是否存在：com.amazonaws.services.glue.model.AccessDeniedException：默认情况下的 Lake Formation 权限不足（服务：AWS Glue；状态码：400；错误代码：AccessDeniedException；请求 ID：XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX；代理：空） 

**解决方法**：在 AWS Glue 作业的目录集成中，AWS Glue 始终尝试使用 AWS Glue `GetDatabase API` 检查默认数据库是否存在。如果未授予 `DESCRIBE` Lake Formation 权限或授予了 `GetDatabase IAM` 权限，则在验证默认数据库是否存在时，作业将失败。

 要解决这个问题，请执行以下操作：

1.  在 Lake Formation 中添加默认数据库的 `DESCRIBE` 权限。

1.  在 Lake Formation 中将附加到 AWS Glue 作业的 IAM 角色配置为数据库创建者。这将自动创建默认数据库，并为该角色授予所需的 Lake Formation 权限。

1.  禁用 `--enable-data-catalog` 选项。（它在 AWS Glue Studio 中显示为**使用 Data Catalog 作为 Hive 元存储**）。

   如果作业中不需要 Spark SQL Data Catalog 集成，可以禁用。

## 错误消息：提供的键映射不适用于给定的数据帧
<a name="data-quality-trouble-error-8"></a>

 **错误条件**：提供的键映射不适用于给定的数据帧。

 **解决方法**：您使用的是 **DataSetMatch** 规则类型，并且交集键有重复项。您的交集键必须唯一，并且不能为 NULL。如果您无法使用唯一的交集键，请考虑使用其他规则类型（例如 **AggregateMatch**）来匹配摘要数据。

## 用户类中的异常：java.lang.RuntimeException：无法获取数据。请查看 CloudWatch 中的日志以获取更多详细信息
<a name="data-quality-trouble-error-9"></a>

 **错误条件**：用户类中的异常：java.lang.RuntimeException：无法获取数据。请查看 CloudWatch 中的日志以获取更多详细信息。

 **解决方法**：当您在基于 Amazon S3 的表上创建 DQ 规则并与 Amazon RDS 或 Amazon Redshift 进行比较时，就会发生这种情况。在这些情况下，AWS Glue 无法加载连接。相反，请尝试在 Amazon Redshift 或 Amazon RDS 数据集上设置 DQ 规则。这是一个已知错误。

## 启动错误：从 S3 下载存储桶时出错
<a name="data-quality-trouble-error-10"></a>

 **错误条件**：启动错误：从 S3 下载存储桶时出错：`aws-glue-ml-data-quality-assets-us-east-1, key: jars/aws-glue-ml-data-quality-etl.jar.Access Denied (Service: Amazon S3; Status Code: 403; Please refer logs for details) `。

 **解决方法**：传递给 AWS Glue 数据质量自动监测功能的角色权限必须允许从前述 Amazon S3 位置进行读取。此 IAM policy 应附加到该角色：

```
{
  "Sid": "allowS3",
  "Effect": "Allow",
  "Action": "s3:GetObject",
  "Resource": "arn:aws:s3:::aws-glue-ml-data-quality-assets-<region>/*"
}
```

 有关详细权限，请参阅 [Data Quality authorization](https://docs.aws.amazon.com/glue/latest/dg/data-quality-authorization.html)。这些库是评估数据集的数据质量所必需的。

## InvalidInputException（状态：400）：无法解析 DataQuality 规则
<a name="data-quality-trouble-error-11"></a>

 **错误条件**：InvalidInputException（状态：400）：无法解析 DataQuality 规则。

 **解决方法**：出现此错误的可能性很多。一种可能性是您的规则可能使用单引号。确认其已用双引号括起来。例如：

```
Rules = [
ColumnValues "tipo_vinculo" in ["CODO", "DOCO", "COCO", "DODO"] AND "categoria" = 'ES"
    AND "cod_bandera" = 'CEP'
```

 将其更改为：

```
Rules = [
(ColumnValues "tipovinculo" in [ "CODO", "DOCO", "COCO", "DODO"]) AND (ColumnValues "categoria" = "ES") 
    AND (ColumnValues "codbandera" = "CEP")
]
```

## 错误：Eventbridge 没有根据我设置的计划触发 Glue DQ 作业
<a name="data-quality-trouble-error-12"></a>

 **错误条件**：Eventbridge 没有根据我设置的计划触发 AWS Glue Data Quality 作业。

 **解决方法**：触发作业的角色可能没有正确的权限。确保您用于启动作业的角色具有[计划评估运行所需的 IAM 设置](https://docs.aws.amazon.com/glue/latest/dg/data-quality-authorization.html#data-quality-iam-setup-evaluation-runs)中提及的权限。

## CustomSQL 错误
<a name="data-quality-trouble-error-13"></a>

**错误条件**：` 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 no columns from the SQL result are present in the Input Dataset. Ensure that matching columns are returned from the SQL`。

 **解决方法**：SQL 查询有效，但请确认仅从主表中选择列。从主函数中选择聚合函数（例如 sum、count 列）可能会导致此错误。



**错误条件**：` There was a problem when executing your SQL statement: cannot resolve "Col"`。

 **解决方法**：主表中不存在此列。



**错误条件**：` The columns that are returned from the SQL statement should only belong to the primary table. "In this case, some columns ( Col ) belong to reference table"`。

 **解决方法**：在 SQL 查询中，当您将主表与其他引用表联接时，确认您的 select 语句仅包含主表中的列名，以便为主表生成行级结果。

## 动态规则
<a name="data-quality-trouble-error-14"></a>

 **错误条件**`: Dynamic rules require job context, and cannot be evaluated in interactive session or data preview.`。

**原因：**当规则集中存在动态 DQ 规则时，此错误消息可能会出现在您的数据预览结果，或其他交互式会话中。动态规则引用与特定作业名称和评估上下文相关的历史指标，因此无法在交互式会话中对其进行评估。

 **解决方法**：运行 AWS Glue 作业将生成历史指标，可在以后的作业运行中为相同的作业引用这些指标。

 **错误条件**：
+  ` [RuleType] rule only supports simple atomic operands in thresholds.`. 
+  `Function last not yet implemented for [RuleType] rule.` 

 **解决方法**：数字表达式中的所有 DQDL 规则类型通常都支持动态规则（请参阅 [DQDL 参考](dqdl.md)）。但是，尚不支持某些生成多个指标（ColumnValues 和 ColumnLength）的规则。

**错误条件**：` Binary expression operands must resolve to a single number.`。

**原因**：动态规则支持二进制表达式，如 `RowCount > avg(last(5)) * 0.9`。此处二进制表达式为 `avg(last(5)) * 0.9`。此规则有效，因为两个操作数 `avg(last(5))` 和 `0.9` 均解析为一个数字。`RowCount > last(5) * 0.9` 是一个错误示例，因为 `last(5)` 会生成一个无法与当前行数进行有意义比较的列表。

 **解决方法**：使用聚合函数将列表值操作数缩减为单个数字。

**错误条件**：
+  `Rule threshold results in list, and a single value is expected. Use aggregation functions to produce a single value. Valid example: sum(last(10)), avg(last(10)).` 
+  `Rule threshold results in empty list, and a single value is expected.` 

**原因**：动态规则可用于将数据集的某些特征，与其历史值进行比较。如果提供了正整数参数，则最后一个函数可以检索多个历史值。例如，`last(5)` 将检索您的规则在作业运行时观测到的最近五个值。

 **解决方法**：必须使用聚合函数将这些值缩减为单个数字，才能与当前作业运行时观测到的值进行有意义的比较。

有效示例：
+ `RowCount >= avg(last(5))`
+ `RowCount > last(1)`
+ `RowCount < last()`

无效示例：`RowCount > last(5)`。

**错误条件**：
+  `Function index used in threshold requires positive integer argument.` 
+  `Index argument must be an integer. Valid syntax example: RowCount > index(last(10, 2)), which means RowCount must be greater than third most recent execution from last 10 job runs.` 

 **解决方法**：在编写动态规则时，您可以使用 `index` 聚合函数从列表中选择一个历史值。例如 `RowCount > index(last(5)`，1) 将检查在当前作业中观测到的行数，是否严格大于在作业中观测到的次新行数。`index` 从零开始编制索引。

**错误条件**：` IllegalArgumentException: Parsing Error: Rule Type: DetectAnomalies is not valid`。

 **解决方法**：异常检测仅在 AWS Glue 4.0 中提供。

**错误条件**：` IllegalArgumentException: Parsing Error: Unexpected condition for rule of type ... no viable alternative at input ...`。

 注意：`...` 是动态的。示例：`IllegalArgumentException: Parsing Error: Unexpected condition for rule of type RowCount with number return type, line 4:19 no viable alternative at input '>last'`。

 **解决方法**：异常检测仅在 AWS Glue 4.0 中提供。

## 用户类中的常：org.apache.spark.sql.AnalysisException: org.apache.hadoop.hive.ql.metadata.HiveException
<a name="data-quality-trouble-error-15"></a>

 **错误条件**`: Exception in User Class: org.apache.spark.sql.AnalysisException: org.apache.hadoop.hive.ql.metadata.HiveException: Unable to fetch table mailpiece_submitted. StorageDescriptor#InputFormat cannot be null for table: mailpiece_submitted (Service: null; Status Code: 0; Error Code: null; Request ID: null; Proxy: null)` 

 **原因：**您在 AWS Glue Data Catalog 中使用 Apache Iceberg，而 AWS Glue Data Catalog 中的“输入格式”属性为空。

 **解决方法**：当您在 DQ 规则中使用 CustomSQL 规则类型时，会出现此问题。解决这个问题的一种方法是使用“主要”或将目录名称 `glue_catalog.` 添加到 `<database>.<table> in Custom ruletype`。

## UNCLASSIFIED\_ERROR; IllegalArgumentException: Parsing Error: No rules or analyzers provided., no viable alternative at input
<a name="data-quality-trouble-error-16"></a>

 **错误条件**`: UNCLASSIFIED_ERROR; IllegalArgumentException: Parsing Error: No rules or analyzers provided., no viable alternative at input` 

 **解决方法**：DQDL 不可解析。在某些情形下可能会出现这种情况。如果您使用的是复合规则，请确保它们的括号正确。

```
(RowCount >= avg(last(10)) * 0.6) and (RowCount <= avg(last(10)) * 1.4) instead of
      RowCount >= avg(last(10)) * 0.6 and RowCount <= avg(last(10)) * 1.4
```