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 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개의 행을 생성합니다.