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 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, 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)에서 수집한 스칼라 통계가 저장됩니다. AWS Glue 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입니다. |
분포 결과 테이블
다음 표에서는 분포 결과 테이블의 열을 설명합니다. 분포 결과는 스칼라 프로파일링 통계와 별도로 저장되며, 빈 또는 범주당 하나의 행이 있습니다. 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 값의 수입니다. 실행 내에서 지정된 통계의 모든 행에 대해 동일한 값입니다. 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입니다. |
행 수준 결과 테이블
다음 표에서는 행 수준 결과 테이블의 열을 설명합니다. 이 테이블을 사용하여 데이터 품질 규칙에 실패한 특정 레코드를 식별할 수 있습니다.
| 열 | 유형 | 설명 |
|---|---|---|
| 소스 열 | 다양. | 원본 소스 데이터의 모든 열입니다. |
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 형식으로 결과를 저장합니다.
-
단일 결과 테이블은 여러 소스 테이블의 결과를 저장할 수 있습니다.
catalog_id,database_name및table_name파티션 열을 사용하여 특정 소스에 대한 결과를 필터링합니다. -
AWS Glue Data Quality는 평가 실행이 완료된 후 관찰 결과를 비동기적으로 작성합니다. 테이블에 관찰 항목이 나타나기까지 약간의 지연이 있을 수 있습니다.
-
분포 결과 테이블의 분포 통계의 경우 각 빈 또는 범주는 별도의 행으로 저장됩니다. 예를 들어 빈이 20개인 히스토그램은 테이블에서 해당 통계에 대한 20개의 행을 생성합니다.