

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 對 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：剖析錯誤：未提供規則或分析器。輸入時沒有可行的替代方案](#data-quality-trouble-error-16)

## 錯誤：缺少 AWS Glue Data Quality 模組
<a name="data-quality-trouble-error-1"></a>

**錯誤訊息**：沒有名為 'awsgluedq' 的模組。

**解決方案**：當您在不支援的版本中執行 AWS Glue Data Quality 時，會發生此錯誤。 AWS Glue Data Quality 僅在 Glue 3.0 版和更新版本中受支援。

## 錯誤： 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；代理：Null)。

**解決方案**：您必須在 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]；第 1 行位置 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>

 **錯誤條件**：AnalysisException：無法驗證預設資料庫是否存在：com.amazonaws.services.glue.model.AccessDeniedException：預設情況下 Lake Formation 許可不足 (服務：AWS Glue；狀態碼：400；錯誤代碼：AccessDeniedException；請求 ID：XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX；代理：null) 

**解決方案**：在 AWS Glue 任務的目錄整合中，AWS Glue 一律會嘗試檢查預設資料庫是否存在或不使用 AWS Glue `GetDatabase API`。如果未授予 `DESCRIBE` Lake Formation 許可或已授予 `GetDatabase IAM` 許可，則在驗證預設資料庫的存在時，該任務會失敗。

 若要解決問題：

1.  在 Lake Formation 中新增預設資料庫的 `DESCRIBE` 許可。

1.  將附加至 AWS Glue 任務的 IAM 角色設定為 Lake Formation 中的資料庫建立者。這會自動建立預設資料庫，並授予角色所需的 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 RDS 或 比較的 Amazon S3 型資料表上建立 DQ 規則時，就會發生這種情況 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) `。

 **解決方案**：傳遞給 Glue Data Quality AWS 的角色中的許可必須允許從先前的 Amazon S3 位置讀取。此 IAM 政策應附加至該角色：

```
{
  "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 這樣的彙總函數，對主資料表中的資料欄進行計數可能會導致此錯誤。



**錯誤條件**：` 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)` 

 **原因：**您在 Glue Data Catalog AWS 中使用 Apache Iceberg，而 AWS Glue Data Catalog 中的輸入格式屬性為空白。

 **解決方案**：當您在 DQ 規則中使用 CustomSQL 規則類型時，會發生此問題。修正此問題的一種方法是使用「主要」或將目錄名稱 `glue_catalog.` 新增至 `<database>.<table> in Custom ruletype`。

## UNCLASSIFIED\_ERROR；IllegalArgumentException：剖析錯誤：未提供規則或分析器。輸入時沒有可行的替代方案
<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
```