

# 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: Unable to verify existence of default database](#data-quality-trouble-error-7)
+ [エラーメッセージ: Provided key map not suitable for given data frames](#data-quality-trouble-error-8)
+ [ユーザークラスの例外: java.lang.RuntimeException : Failed to fetch data. Check the logs in CloudWatch to get more details](#data-quality-trouble-error-9)
+ [LAUNCH ERROR: Error downloading from S3 for bucket](#data-quality-trouble-error-10)
+ [InvalidInputException (status: 400): DataQuality rules cannot be parsed](#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>

**エラーメッセージ**: No module named 'awsgluedq'.

**解決方法**: このエラーは、AWS Glue Data Quality をサポートされていないバージョンで実行すると発生します。AWSGlue Data Quality は、Glue のバージョン 3.0 移行でのみサポートされています。

## エラー: AWS Lake Formation のアクセス許可が不十分である
<a name="data-quality-trouble-error-2"></a>

**エラーメッセージ**: Exception in User Class: `com.amazonaws.services.glue.model.AccessDeniedException`: Insufficient Lake Formation permission(s) on impact\_sdg\_involvement (Service: AWS Glue; Status Code: 400; Error Code: AccessDeniedException; Request ID: 465ae693-b7ba-4df0-a4e4-6b17xxxxxxxx; Proxy: null).

**解決方法**: AWS Lake Formation に十分なアクセス許可を付与する必要があります。

## エラー: ルールセットに一意の名前が付いていない
<a name="data-quality-trouble-error-3"></a>

**エラーメッセージ**: Exception in User Class: ...services.glue.model.AlreadyExistsException: Another ruleset with the same name already exists.

**解決方法**: ルールセットはグローバルであり、一意である必要があります。

## エラー: テーブルに特殊文字が含まれている
<a name="data-quality-trouble-error-4"></a>

**エラーメッセージ**: Exception in User Class: org.apache.spark.sql.AnalysisException: cannot resolve ''C'' given input columns: [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>

**エラーメッセージ**: Exception in User Class: java.lang.StackOverflowError.

**解決方法**: 2,000 以上のルールを含む大規模なルールセットを使用すると、このエラーが発生する可能性があります。ルールを複数のルールセットに分割します。

## エラー: ルール全体のステータスが失敗である
<a name="data-quality-trouble-error-6"></a>

**エラーの状態**: My Ruleset is successful, but my overall rule status is failed.

**解決方法**: このエラーは、パブリッシュの最中に Amazon CloudWatch にメトリクスをパブリッシュするオプションを選択したことが原因と考えられます。データセットが VPC にある場合、お使いの VPC が、AWS Glue に対して、メトリクスを Amazon CloudWatch にパブリッシュすることを許可していない可能性があります。その場合は、VPC が Amazon CloudWatch にアクセスできるようエンドポイントをセットアップする必要があります。

## AnalysisException: Unable to verify existence of default database
<a name="data-quality-trouble-error-7"></a>

 **エラー状態**: AnalysisException: Unable to verify existence of default database: com.amazonaws.services.glue.model.AccessDeniedException: Insufficient Lake Formation permission(s) on default (Service: AWS Glue; Status Code: 400; Error Code: AccessDeniedException; Request ID: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX; Proxy: 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 では **[Use Data Catalog as the Hive metastore]** と表示されます)。

   ジョブに Spark SQL Data Catalog 統合を必要としない場合は、無効にできます。

## エラーメッセージ: Provided key map not suitable for given data frames
<a name="data-quality-trouble-error-8"></a>

 **エラー状態**: Provided key map not suitable for given data frames.

 **解決方法**: 現在、**DataSetMatch** ルールタイプを使用しており、結合キーが重複しています。結合キーは一意でなければならず、また NULL であってはなりません。一意の結合キーを使用できない場合は、**AggregateMatch** のような他のルール型を使用してサマリーデータで照合することを検討します。

## ユーザークラスの例外: java.lang.RuntimeException : Failed to fetch data. Check the logs in CloudWatch to get more details
<a name="data-quality-trouble-error-9"></a>

 **エラー状態**: Exception in User Class: java.lang.RuntimeException : Failed to fetch data. Check the logs in CloudWatch to get more details.

 **解決方法**: このエラーは、Amazon S3 ベースのテーブルで、Amazon RDS または Amazon Redshift と比較する DQ ルールを作成しているときに発生します。この場合、AWS Glue は接続をロードできません。代わりに、Amazon Redshift または Amazon RDS データセットで DQ ルールを設定します。これは既知のバグです。

## LAUNCH ERROR: Error downloading from S3 for bucket
<a name="data-quality-trouble-error-10"></a>

 **エラー状態**: LAUNCH ERROR: Error downloading from S3 for bucket: `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 Data Quality に渡されるロール内のアクセス許可は、上記の 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 (status: 400): DataQuality rules cannot be parsed
<a name="data-quality-trouble-error-11"></a>

 **エラー状態**: InvalidInputException (status: 400): DataQuality rules cannot be parsed.

 **解決方法**: このエラーには、さまざまな原因が考えられます。その 1 つが、ルールに一重引用符が含まれていることです。二重引用符で囲まれていることを確認してください。例えば、次のようになります。

```
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 is not triggering AWS Glue Data Quality jobs based on the schedule I setup.

 **解決方法**: ジョブをトリガーするロールに適切なアクセス許可が付与されていない可能性があります。ジョブのトリガーに使用するロールに、「[評価実行のスケジューリングに必要な 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)` は現在の行数と有意義な比較ができないリストが生成されるからです。

 **解決策**: 集計関数を使用して、リスト値のオペランドを 1 つの数値に減らします。

**エラー状態**:
+  `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)` は、ルールのジョブ実行で確認された直近の 5 つの値を取得します。

 **解決策**: 集計関数を使用してこれらの値を 1 つの数値に減らし、現在のジョブ実行で測定された値と有意義な比較を行う必要があります。

有効な例:
+ `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` 集計機能を使用してリストから 1 つの履歴値を選択できます。例えば、`RowCount > index(last(5)`, 1) は、現在のジョブで観測された行数が、そのジョブで観測された行数の中で 2 番目に新しい行数より真に大きいかどうかを確認します。`index` のインデックスは 0 です。

**エラー状態**: ` 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 ルールタイプを使用しているときに発生します。この問題を解決する 1 つの方法は、「プライマリ」を使用するか、`<database>.<table> in Custom ruletype` に `glue_catalog.` のカタログ名を追加することです。

## 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
```