View a markdown version of this page

Data Catalog テーブルへのデータ品質結果の書き込み - AWS Glue

Data Catalog テーブルへのデータ品質結果の書き込み

AWS Glue Data Quality 評価実行を設定して、AWS Glue Data Catalog の Apache Iceberg テーブルに結果を自動的に書き込むことができます。結果の出力を有効にすると、を使用してデータ品質の結果を直接クエリし、視覚化ツールを使用してダッシュボードを構築し、アカウント全体でデータ品質の結果の履歴を一元的に維持できます。

Data Catalog テーブルに次のタイプのデータ品質結果を書き込むことができます。

  • ルール結果 – 評価されたメトリクスや失敗の理由など、ルールセット内の各ルールの合格または不合格の結果

  • プロファイリング結果 – スカラー値 (平均値や標準偏差など) や分布データ (ヒストグラムや値分布) など、アナライザーによって収集された統計

  • 行レベルの結果 – データセット内のどの特定の行が各ルールに合格または不合格になったかを識別するレコードごとの評価結果

  • 観察結果 – 予想値、予測範囲、実際の値が異常としてフラグ付けされたかどうかを含む異常検出予測

前提条件

データ品質結果を Data Catalog テーブルに書き込むには、評価の実行に使用する IAM ロールに次のアクセス許可が必要です。

  • AWS Glue Data Catalog でデータベースとテーブルを作成および更新するためのアクセス許可

  • Iceberg テーブルデータが保存されている Amazon S3 の場所に書き込むアクセス許可

評価の実行では、指定した IAM ロールを使用して結果テーブルに書き込みます。これは、ソースデータテーブルにアクセスできるロールと同じです。

結果出力の設定

StartDataQualityRulesetEvaluationRun API の --additional-run-options パラメータまたは AWS Glue ETL ジョブの additional_options パラメータを使用して、データ品質結果の出力を設定します。デフォルトでは、AWS Glue Data Quality は Data Catalog テーブルに結果を書き込みません。書き込む各結果タイプを明示的に有効にする必要があります。

各結果タイプには、共有 CatalogTableConfig 構造を持つ独自の設定ブロックがあります。CatalogTableConfig を指定しない場合、AWS Glue Data Quality はテーブル名と Amazon S3 パスを含むデフォルト値を自動的に導出します。

CatalogTableConfig 構造には、次のフィールドが含まれています。

  • DatabaseName (オプション) – ターゲットテーブルのカタログデータベースの名前。指定しない場合、デフォルトデータベースが作成されます。

  • TableName (オプション) – ターゲットテーブルの名前。指定しない場合は、デフォルトのテーブル名が使用されます。

  • S3Location (オプション) – テーブルデータが保存されている Amazon S3 の場所。形式: s3://amzn-s3-demo-bucket/prefix/。指定しない場合、結果はデフォルトの場所に保存されます。

  • CatalogId (オプション) – テーブルを作成する AWS Glue データカタログの ID。指定されない場合、デフォルトで AWS アカウント ID が使用されます。

例: ルール結果とプロファイリング結果を設定する

aws glue start-data-quality-ruleset-evaluation-run \ --data-source '{ "GlueTable": { "DatabaseName": "my_database", "TableName": "my_table" } }' \ --role "arn:aws:iam::123456789012:role/GlueServiceRole" \ --ruleset-names '["my_ruleset"]' \ --additional-run-options '{ "DataQualityRuleResults": { "WriteDataQualityRuleResultsEnabled": true, "CatalogTableConfig": { "DatabaseName": "quality_results", "TableName": "rule_results" } }, "ProfilingResults": { "WriteProfilingResultsEnabled": true, "CatalogTableConfig": { "DatabaseName": "quality_results", "TableName": "profiles" } } }'

例: 行レベルの結果を設定する

行レベルの結果では、含めるレコードのタイプと書き込む最大行数を指定することもできます。

aws glue start-data-quality-ruleset-evaluation-run \ --data-source '{ "GlueTable": { "DatabaseName": "my_database", "TableName": "my_table" } }' \ --role "arn:aws:iam::123456789012:role/GlueServiceRole" \ --ruleset-names '["my_ruleset"]' \ --additional-run-options '{ "RowLevelResults": { "MaxRowsToWrite": 5000, "ResultType": "FAILED_ONLY", "CatalogTableConfig": { "DatabaseName": "quality_results", "TableName": "row_level_results" } } }'

ResultType パラメータには、次の値を指定できます。

  • FAILED_ONLY - 少なくとも 1 つのデータ品質ルールに失敗した行のみを書き込みます。

  • PASSED_ONLY – すべてのデータ品質ルールに合格した行のみを書き込みます。

  • ALL – 評価結果を含むすべての行を書き込みます。

例 – AWS Glue ETL ジョブで設定する

AWS Glue ETL ジョブでは、ドット表記キーを持つ additional_options パラメータを使用して結果出力を設定します。

result = EvaluateDataQuality.process_rows( frame=dynamic_frame, ruleset=ruleset, publishing_options={ "dataQualityEvaluationContext": "my_context", "enableDataQualityResultsPublishing": True }, additional_options={ "observations.scope": "ALL", "dataQualityResultsPublishing.strategy": "BEST_EFFORT", "dataQualityResultsPublishing.resultsFormat.profilingResults.writeProfilingResultsEnabled": "true", "dataQualityResultsPublishing.resultsFormat.profilingResults.catalogTableConfig.databaseName": "my_db", "dataQualityResultsPublishing.resultsFormat.profilingResults.catalogTableConfig.tableName": "profiling_results", "dataQualityResultsPublishing.resultsFormat.profilingResults.catalogTableConfig.s3Location": "s3://amzn-s3-demo-bucket/profiling/", "dataQualityResultsPublishing.resultsFormat.profilingResults.catalogTableConfig.catalogId": "123456789012" } )

例 – 観測結果を設定する

観測結果は、他の結果タイプと同じ方法で設定できます。観測結果では、異常検出を有効にする必要があります (ObservationScope: ALL)。

aws glue start-data-quality-ruleset-evaluation-run \ --data-source '{ "GlueTable": { "DatabaseName": "my_database", "TableName": "my_table" } }' \ --role "arn:aws:iam::123456789012:role/GlueServiceRole" \ --ruleset-names '["my_ruleset"]' \ --additional-run-options '{ "ObservationScope": "ALL", "ObservationResults": { "WriteObservationResultsEnabled": true, "CatalogTableConfig": { "DatabaseName": "quality_results", "TableName": "observation_results" } } }'

テーブルスキーマ

AWS Glue Data Quality は、各結果タイプを個別の Iceberg テーブルに書き込みます。ルール結果、プロファイリング結果 (個別の分布結果テーブルを含む)、観測結果テーブルは、効率的なクエリを可能にするために、catalog_id、database_name、table_name、day(stored_on) でパーティション分割されます。時間ベースのクエリでは stored_on を直接フィルタリングでき、Iceberg はパーティションのプルーニングを自動的に処理します。

ルール結果テーブル

ルール結果テーブルでは、データ品質の実行中に評価された各ルールの合格または不合格の結果が保存されます。

列 型 説明
dq_result_id STRING データ品質結果の一意の識別子。
rule_name STRING ルール名 (Rule_1 など)。
rule_description STRING ルールの DQDL 式。
rule_result STRING 評価結果: PASS または FAIL。
evaluation_message STRING 該当する場合、失敗の理由を説明するメッセージ。
evaluated_metrics MAP<STRING, DOUBLE> ルールによって評価されるメトリクス。
catalog_id STRING ソーステーブルのカタログ ID。
database_name STRING ソーステーブルのデータベース名。
table_name STRING ソーステーブルの名前。
ruleset_evaluation_run_id STRING 評価実行の ID。
started_on TIMESTAMP 評価が開始された時刻。
completed_on TIMESTAMP 評価が完了した時刻。
evaluated_rule STRING オペランド解決後に評価されたルール式。
ruleset_name STRING この結果を生成したルールセットの名前。

プロファイリング結果テーブル

次の表では、プロファイリング結果テーブルについて説明します。このテーブルには、アナライザーとルール (Mean、StandardDeviation、Completeness など) によって収集されたスカラー統計が保存されます。AWSGlue Data Quality は、分布統計を別の分布結果テーブルに保存します。

列 型 説明
profile_id STRING データ品質プロファイルの一意の識別子。
statistic_id STRING 統計の一意の識別子。
statistic_name STRING 統計の名前 (例: Mean、Completeness)
evaluation_level STRING 統計が評価されるレベル: Dataset、Column、または Multicolumn。
statistics_value DOUBLE 統計のスカラー値。
statistic_properties MAP<STRING, STRING> 統計の追加プロパティ。
columns_referenced ARRAY<STRING> 統計によって参照される列。
referenced_datasets ARRAY<STRING> 統計の参照データセット。
column_name STRING ターゲット列名。
dq_result_id STRING データ品質結果識別子。
started_on TIMESTAMP 評価が開始された時刻。
completed_on TIMESTAMP 評価が完了した時刻。
stored_on TIMESTAMP レコードがテーブルに書き込まれた日時。
catalog_id STRING ソーステーブルのカタログ ID。
database_name STRING ソーステーブルのデータベース名。
table_name STRING ソーステーブルの名前。
region STRING AWS リージョン
account_id STRING AWS アカウント ID。
ruleset_evaluation_run_id STRING 評価実行の ID。

分布結果テーブル

次の表では、分布結果テーブルについて説明します。分布結果は、スカラープロファイリング統計とは別に、ビンまたはカテゴリごとに 1 行ずつ保存されます。このテーブルは、ProfilingResults.DistributionResults ブロック内で設定できます。

列 型 説明
statistic_id STRING 分布統計の一意の識別子。
column_name STRING ソース列 (「age」や「department」など)。
data_type STRING 列のデータ型 (「LongType」、「StringType」など)。
num_bins INT 分布に使用されるビンの数。
bin_index INT ビンの 0 ベースの位置。
bin_label STRING カテゴリ列の場合: 個別の値。数値列の場合は NULL。
bin_lower_bound STRING 数値列の場合: ビンの下端。カテゴリ列の場合は NULL。
bin_upper_bound STRING 数値列の場合: ビンの上端。カテゴリ列の場合は NULL。
bin_count BIGINT このビンの頻度カウント。
null_count INT 分布から除外された NULL 値の数。1 つの実行内の特定の統計について、すべての行で同じ値になっている。Null が存在しない場合は NULL。
tail_count INT 上位 20 を超えるカテゴリ値の頻度を集計します。1 つの実行内の特定の統計について、すべての行で同じ値になっている。数値ヒストグラムの場合は NULL。
profile_id STRING プロファイル識別子。
dq_result_id STRING データ品質結果識別子。
ruleset_evaluation_run_id STRING 評価実行識別子。
started_on TIMESTAMP 評価が開始された時刻。
completed_on TIMESTAMP 評価が完了した時刻。
stored_on TIMESTAMP レコードがテーブルに書き込まれた日時。
catalog_id STRING ソーステーブルのカタログ ID。
database_name STRING ソーステーブルのデータベース名。
table_name STRING ソーステーブルの名前。
region STRING AWS リージョン
account_id STRING AWS アカウント ID。

行レベルの結果テーブル

次の表では、行レベルの結果テーブルについて説明します。このテーブルを使用して、データ品質ルールに失敗した特定のレコードを特定できます。

列 型 説明
ソース列 可変。 元のソースデータからのすべての列。
data_quality_rules_pass ARRAY<STRING> このレコードがチェックに合格したルール。
data_quality_rules_fail ARRAY<STRING> このレコードがチェックに不合格となったルール。
data_quality_rules_skip ARRAY<STRING> このレコードに対してスキップされたルール。
data_quality_evaluation_result STRING このレコードの全体的な評価結果: Passed または Failed。
dq_result_id STRING データ品質結果の一意の識別子。
ruleset_evaluation_run_id STRING 評価実行の ID。
started_on TIMESTAMP 評価が開始された時刻。
completed_on TIMESTAMP 評価が完了した時刻。
stored_on TIMESTAMP レコードがテーブルに書き込まれた日時。
catalog_id STRING ソーステーブルのカタログ ID。
database_name STRING ソーステーブルのデータベース名。
table_name STRING ソーステーブルの名前。
region STRING AWS リージョン
account_id STRING AWS アカウント ID。

観察結果テーブル

観測結果テーブルには、各評価実行における各統計の異常検出予測が保存されます。このテーブルには、異常、正常値、スキップされた予測など、すべての予測結果が含まれます。これにより、予測バンドを使用して連続傾向グラフをレンダリングできます。

列 型 説明
statistic_id STRING モニタリング対象の統計の識別子。
statistic_name STRING モニタリング対象の統計の名前。
prediction_outcome STRING 異常検出結果: ANOMALY、NOT_ANOMALY、または SKIPPED。
expected_value DOUBLE 予測された期待値。予測がスキップされた場合は NULL。
lower_bound DOUBLE 予測範囲の下限。予測がスキップされた場合は NULL。
upper_bound DOUBLE 予測範囲の上限。予測がスキップされた場合は NULL。
observation_message STRING 検出された場合の異常の説明。
training_input STRING このデータポイントが異常検出モデルに含まれるかどうか: INCLUDED または EXCLUDED。
ruleset_evaluation_run_id STRING 評価実行の ID。
recorded_on TIMESTAMP 観察が記録された日時。
stored_on TIMESTAMP レコードがテーブルに書き込まれた日時。
actual_value DOUBLE 統計の実際の観察値。
training_status STRING 異常検出モデルトレーニングのステータス (例: PENDING、COMPLETED)。
recommended_rules STRING 異常検出予測に基づいて推奨されるルール。
modified_rules STRING 予測に基づいて更新されたしきい値で変更されたルール。
catalog_id STRING ソーステーブルのカタログ ID。
database_name STRING ソーステーブルのデータベース名。
table_name STRING ソーステーブルの名前。
注記

観測結果テーブルは、追加のみの書き込みモデルを使用します。BatchPutDataQualityStatisticAnnotation API を使用してデータポイントを除外すると、training_input が EXCLUDED に設定された新しい行が追加されます。各観察の最新状態をクエリするには、stored_on タイムスタンプを使用して、各統計と実行の組み合わせの最新の行を識別します。

注記

このテーブルには、値の 2% 以上がフリーズされたビンの境界外にある場合に生成される分布オーバーフロー観察値も保存されます。これらの行には statistic_name = 'Distribution' があり、prediction_outcome は NULL です。observation_message フィールドには、オーバーフローの説明が含まれています。

を使用した結果のクエリ

データ品質評価が完了したら、を使用して結果テーブルを直接クエリできます。次の例は、一般的なクエリパターンを示しています。

例: 特定の実行で失敗したルールを検索する

SELECT rule_name, rule_description, evaluation_message, evaluated_metrics FROM quality_results.rule_results WHERE ruleset_evaluation_run_id = 'dqr-12345678' AND rule_result = 'FAIL' ORDER BY rule_name;

例: プロファイリング統計を経時的に表示する

SELECT stored_on, statistics_value FROM quality_results.profiles WHERE database_name = 'my_database' AND table_name = 'my_table' AND statistic_name = 'Mean' AND columns_referenced = ARRAY['salary'] ORDER BY stored_on;

例 – 特定のルールに対して不合格の行を特定する

SELECT * FROM quality_results.row_level_results WHERE data_quality_evaluation_result = 'Failed' AND contains(data_quality_rules_fail, 'IsComplete "email"');

例 – 数値ヒストグラムを表示する

SELECT bin_index, bin_lower_bound, bin_upper_bound, bin_count FROM quality_results.distributions WHERE column_name = 'salary' AND ruleset_evaluation_run_id = 'dqrun-abc123' ORDER BY bin_index;

例 – カテゴリ値の分布を表示する

SELECT bin_label, bin_count FROM quality_results.distributions WHERE column_name = 'department' AND ruleset_evaluation_run_id = 'dqrun-abc123' ORDER BY bin_count DESC;

例 – カテゴリの頻度を経時的に追跡する

SELECT started_on, bin_count FROM quality_results.distributions WHERE column_name = 'status' AND bin_label = 'active' ORDER BY started_on;

例: 予測バンドを使用して異常検出の傾向を表示する

SELECT o.recorded_on, p.statistics_value AS actual_value, o.expected_value, o.lower_bound, o.upper_bound, o.prediction_outcome FROM quality_results.profiles p JOIN quality_results.observation_results o ON p.statistic_id = o.statistic_id AND p.ruleset_evaluation_run_id = o.ruleset_evaluation_run_id WHERE p.database_name = 'my_database' AND p.table_name = 'my_table' AND p.statistic_name = 'RowCount' AND p.stored_on >= DATE '2025-03-01' ORDER BY p.stored_on;

例 – 注釈の後に最新の観察状態をクエリする

観察結果テーブルは追加のみのモデルを使用するため、除外注釈は新しい行を追加します。重複排除クエリを使用して、各観察の最新状態を取得します。

SELECT statistic_id, statistic_name, prediction_outcome, expected_value, lower_bound, upper_bound, training_input, stored_on FROM ( SELECT *, ROW_NUMBER() OVER ( PARTITION BY statistic_id, ruleset_evaluation_run_id ORDER BY stored_on DESC ) AS rn FROM quality_results.observation_results WHERE database_name = 'my_database' AND table_name = 'my_table' ) WHERE rn = 1 ORDER BY stored_on;

考慮事項

データ品質結果を Data Catalog テーブルに書き込むときは、次の考慮事項に注意してください。

  • AWS Glue Data Quality は、効率的なタイムトラベルクエリとパーティションプルーニングをサポートする Apache Iceberg 形式で結果を保存します。

  • 1 つの結果テーブルに複数のソーステーブルの結果を保存できます。catalog_id、database_name、table_name パーティション列を使用して、特定のソースの結果をフィルタリングします。

  • AWS Glue Data Quality は、評価の実行が完了した後に観察結果を非同期的に書き込みます。観察値がテーブルに表示されるまでに少し時間がかかる場合があります。

  • 分布結果テーブルの分布統計の場合、各ビンまたはカテゴリは個別の行として保存されます。例えば、20 個のビンを持つヒストグラムは、その統計のテーブルに 20 行を生成します。