本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
將資料品質結果寫入 Data Catalog 資料表
您可以設定 AWS Glue Data Quality 評估執行,以自動將結果寫入 Glue Data Catalog 中的 Apache Iceberg AWS 資料表。啟用結果輸出後,您可以直接使用 查詢資料品質結果、使用視覺化工具建置儀表板,並在整個帳戶中維護資料品質結果的集中式歷史記錄。
您可以將下列類型的資料品質結果寫入 Data Catalog 資料表:
-
規則結果 – 規則集中每個規則的通過或失敗結果,包括評估指標和失敗原因
-
分析結果 – 分析器收集的統計資料,包括純量值 (例如平均值和標準差) 和分佈資料 (直方圖和值分佈)
-
資料列層級結果 – 每個記錄的評估結果,用於識別資料集中的哪些特定資料列傳遞或失敗每個規則
-
觀察結果 – 異常偵測預測,包括預期值、預測界限,以及實際值是否標記為異常
先決條件
若要將資料品質結果寫入 Data Catalog 資料表,您用於評估執行的 IAM 角色必須具有下列許可:
-
在 Glue Data Catalog AWS 中建立和更新資料庫和資料表的許可
-
寫入儲存 Iceberg 資料表資料的 Amazon S3 位置的許可
評估執行會使用您指定的 IAM 角色來寫入結果資料表。這是可存取來源資料表的相同角色。
設定結果輸出
您可以使用 StartDataQualityRulesetEvaluationRun API 的 --additional-run-options 參數或 Glue ETL AWS 任務中的 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 Data Catalog 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– 僅寫入至少一個資料品質規則失敗的資料列。 -
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、table_name、 database_name和 進行分割day(stored_on),以啟用有效的查詢。您可以stored_on直接篩選以時間為基礎的查詢,而 Iceberg 會自動處理分割區剔除。
規則結果資料表
規則結果資料表會儲存資料品質執行期間評估的每個規則的通過或失敗結果。
| 資料行 | Type | Description |
|---|---|---|
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) 收集的純量統計資料。 AWS Glue Data Quality 會將分佈統計資料存放在單獨的分佈結果資料表中。
| 資料行 | Type | Description |
|---|---|---|
profile_id |
STRING | 資料品質設定檔的唯一識別符。 |
statistic_id |
STRING | 統計資料的唯一識別符。 |
statistic_name |
STRING | 統計資料的名稱 (例如,Mean、Completeness) |
evaluation_level |
STRING | 評估統計資料的層級:Column、 Dataset或 Multicolumn。 |
statistics_value |
DOUBLE | 統計資料的純量值。 |
statistic_properties |
MAP<STRING、STRRING> | 統計資料的其他屬性。 |
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。 |
分佈結果資料表
下表說明分佈結果表格中的資料欄。分佈結果與純量分析統計資料分開存放,每個儲存貯體或類別各一個資料列。您可以在 ProfilingResults.DistributionResults區塊內設定此資料表。
| 資料行 | Type | Description |
|---|---|---|
statistic_id |
STRING | 分佈統計資料的唯一識別符。 |
column_name |
STRING | 來源欄 (例如 "age" 或 "department")。 |
data_type |
STRING | 資料欄的資料類型 (例如,「LongType」、「StringType」)。 |
num_bins |
INT | 用於分佈的 bin 數量。 |
bin_index |
INT | 以 0 為基礎的 bin 位置。 |
bin_label |
STRING | 對於分類資料欄:不同的值。數字資料欄的 NULL。 |
bin_lower_bound |
STRING | 對於數值資料欄:儲存貯體的下邊緣。分類資料欄的 NULL。 |
bin_upper_bound |
STRING | 對於數值資料欄:儲存貯體的上邊緣。分類資料欄的 NULL。 |
bin_count |
BIGINT | 此儲存貯體的頻率計數。 |
null_count |
INT | 從分佈中排除的 NULL 值數目。執行中指定統計資料的每一列都具有相同的值。當不存在 null 時為 NULL。 |
tail_count |
INT | 超過前 20 個類別值的彙總頻率。執行中指定統計資料的每一列都具有相同的值。數值長條圖的 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。 |
資料列層級結果資料表
下表說明資料列層級結果表格中的資料欄。您可以使用此表格來識別資料品質規則失敗的特定記錄。
| 資料行 | Type | 說明 |
|---|---|---|
| 來源資料欄 | 不同 | 原始來源資料中的所有資料欄。 |
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。 |
觀察結果資料表
觀察結果資料表會在每次評估執行時,儲存每個統計資料的異常偵測預測。資料表包含所有預測結果:異常、正常值和略過的預測。這可讓您使用預測範圍轉譯連續趨勢圖。
| 資料行 | Type | Description |
|---|---|---|
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 格式儲存結果,以支援有效的時間歷程查詢和分割區剔除。
-
單一結果資料表可以存放多個來源資料表的結果。使用
catalog_id、database_name和table_name分割區資料欄來篩選特定來源的結果。 -
AWS Glue Data Quality 會在評估執行完成後以非同步方式寫入觀察結果。在 資料表中出現觀察之前,可能會有短暫的延遲。
-
對於分佈結果表中的分佈統計資料,每個儲存貯體或類別都會儲存為單獨的資料列。例如,具有 20 個 bin 的長條圖會在資料表中為該統計資料產生 20 列。