

# AWS Glue Data Quality
<a name="glue-data-quality"></a>

AWS Glue Data Quality에서는 올바른 비즈니스 결정을 내릴 수 있도록 데이터의 품질을 측정하고 모니터링합니다. 오픈 소스 DeeQu 프레임워크를 기반으로 구축된 AWS Glue Data Quality는 관리형 서버리스 환경을 제공합니다. AWS Glue Data Quality는 데이터 품질 정의 언어(DQDL)를 사용합니다. 이 언어는 데이터 품질에 대한 규칙을 정의하는 데 사용되는 도메인 특정 언어입니다. DQDL 및 지원되는 규칙 유형에 대한 자세한 내용은 [데이터 품질 정의 언어(DQDL) 참조](dqdl.md) 섹션을 참조하세요.

추가 제품 세부 정보 및 요금은 [AWS Glue Data Quality](https://aws.amazon.com/glue/features/data-quality)의 서비스 페이지를 참조하세요.

## 이점 및 주요 특징
<a name="glue-data-quality-key-features"></a>

 AWS Glue Data Quality의 이점과 주요 특성은 다음과 같습니다.
+  **서버리스** - 설치, 패치 또는 유지 관리가 필요하지 않습니다.
+  **빠른 시작** - AWS Glue Data Quality는 데이터를 빠르게 분석하고 사용자를 위해 데이터 품질 규칙을 생성합니다. '데이터 품질 규칙 생성 → 권장 규칙'을 두 번만 클릭하여 시작할 수 있습니다.
+  **데이터 품질 문제 탐지** – 기계 학습(ML)을 사용하여 이상과 탐지하기 어려운 데이터 품질 문제를 탐지합니다.
+  **규칙 사용자 지정** - 25개 이상의 기본 DQ 규칙부터 시작하여 특정 요구 사항에 맞는 규칙을 생성할 수 있습니다.
+  **품질 평가 및 신뢰할 수 있는 비즈니스 의사 결정 지원** - 규칙을 평가한 후에는 데이터 상태에 대한 개요를 제공하는 Data Quality 점수를 제공합니다. Data Quality 점수를 사용하여 신뢰할 수 있는 비즈니스 의사 결정을 지원합니다.
+  **잘못된 데이터를 정확하게 식별** - AWS Glue Data Quality를 사용하면 품질 평가 점수를 떨어뜨리는 해당 레코드를 정확히 식별할 수 있습니다. 데이터를 쉽게 식별하고 격리한 후 수정할 수 있습니다.
+  **사용한 만큼만 지불** - AWS Glue Data Quality를 사용하는 데 요구되는 연간 라이선스는 없습니다.
+  **종속성 없음** - AWS Glue Data Quality는 오픈 소스 DeeQu를 기반으로 구축되었므로 작성 중인 규칙을 오픈 언어에서 유지할 수 있습니다.
+  **데이터 품질 검사** - Data Catalog 및 AWS Glue ETL 파이프라인에서 데이터 품질 검사를 적용하여 저장 중인 데이터 및 전송 중인 데이터의 품질을 관리할 수 있습니다.
+  **ML 기반 데이터 품질 탐지** – 기계 학습(ML)을 사용하여 이상과 탐지하기 어려운 데이터 품질 문제를 탐지합니다.
+  **규칙을 표현할 수 있는 개방형 언어** - 데이터 품질 규칙이 일관되고 간단하게 작성되도록 보장합니다. 비즈니스 사용자는 자신이 이해할 수 있는 간단한 언어로 데이터 품질 규칙을 쉽게 표현할 수 있습니다. 엔지니어에게 이 언어는 코드를 생성하고, 일관된 버전 제어를 구현하고, 배포를 자동화할 수 있는 유연성을 제공합니다.

## 작동 방식
<a name="glue-data-quality-how-it-works"></a>

AWS Glue Data Quality에는 AWS Glue Data Catalog 및 AWS Glue ETL 작업이라는 두 가지 진입점이 있습니다. 이 섹션에서는 각 진입점에서 지원하는 사용 사례 및 AWS Glue 기능에 대한 개요를 제공합니다.

### AWS Glue Data Catalog에 대한 데이터 품질
<a name="glue-data-quality-for-data-catalog"></a>

AWS Glue Data Quality는 AWS Glue Data Catalog에 저장된 객체를 평가합니다. 이를 통해 코딩 작성자가 아닌 사용자도 데이터 품질 규칙을 쉽게 설정할 수 있습니다. 이러한 페르소나로, 데이터 관리자 및 비즈니스 분석가가 해당됩니다.



[![AWS Videos](http://img.youtube.com/vi/https://www.youtube.com/embed/rK1NGQu4Sgg/0.jpg)](http://www.youtube.com/watch?v=https://www.youtube.com/embed/rK1NGQu4Sgg)




다음과 같은 사용 사례에서 이 옵션을 선택할 수 있습니다.
+ AWS Glue Data Catalog에서 이미 카탈로그화한 데이터 세트에 대해 데이터 품질 작업을 수행하려고 합니다.
+ 데이터 거버넌스 관련 업무를 수행하면서 데이터 레이크의 데이터 품질 문제를 지속적으로 식별하거나 평가해야 합니다.

다음 인터페이스를 사용하여 데이터 카탈로그의 데이터 품질을 관리할 수 있습니다.
+ AWS Glue 관리 콘솔
+ AWS Glue API

AWS Glue Data Catalog에 대해 AWS Glue Data Quality를 시작하려면 [Data Catalog에서 AWS Glue Data Quality 시작하기](data-quality-getting-started.md) 섹션을 참조하세요.

### AWS Glue ETL 작업에 대한 데이터 품질
<a name="glue-data-quality-for-etl"></a>

AWS Glue ETL 작업에 대한 AWS Glue Data Quality를 통해 사전 예방적 데이터 품질 작업을 수행할 수 있습니다.** 사전 예방적 작업을 사용하면 데이터 세트를 데이터 레이크에 로드하기 전에 잘못된 데이터를 식별하고 필터링할 수 있습니다.**

[![AWS Videos](http://img.youtube.com/vi/https://www.youtube.com/embed/DUd5s_CFtBM/0.jpg)](http://www.youtube.com/watch?v=https://www.youtube.com/embed/DUd5s_CFtBM)


다음 사용 사례에서 ETL 작업에 대한 데이터 품질을 선택할 수 있습니다.
+ 데이터 품질 작업을 ETL 작업에 통합하려고 합니다.
+ ETL 스크립트에서 데이터 품질 작업을 정의하는 코드를 작성하려고 합니다.
+ 시각적 데이터 파이프라인에서 이동하는 데이터의 품질을 관리하려고 합니다.

다음 인터페이스를 사용하여 ETL 작업에 대한 데이터 품질을 관리할 수 있습니다.
+ AWS Glue Studio, AWS Glue Studio 노트북 및 AWS Glue 대화형 세션
+ ETL 스크립트 작성을 위한 AWS Glue 라이브러리
+ AWS Glue API

ETL 작업에 대한 Data Quality를 시작하려면 *AWS Glue Studio 사용 설명서*의 [자습서: Data Quality 시작하기](https://docs.aws.amazon.com/glue/latest/ug/gs-data-quality-chapter.html)를 참조하세요.

### 데이터 카탈로그에 대한 데이터 품질과 ETL 작업에 대한 데이터 품질 비교
<a name="glue-data-quality-compare"></a>

이 테이블에서는 AWS Glue Data Quality의 각 진입점에서 지원하는 기능에 대한 개요를 제공합니다.


****  

| 기능 | 데이터 카탈로그에 대한 데이터 품질 | ETL 작업에 대한 데이터 품질 | 
| --- | --- | --- | 
| 데이터 소스 | Data Catalog와 호환되는 Amazon S3, Amazon Redshift, JDBC 소스, 그리고 Apache Iceberg, Apache Hudi, Delta Lake 등의 트랜잭션 데이터 레이크 형식. AWS Lake Formation 관리형 OTF 형식도 지원되지만 몇 가지 제한 사항이 있습니다. AWS Glue Data Catalog에 카탈로그화된 Amazon Athena 뷰는 지원되지 않습니다. [지원되는 소스 유형](data-quality-getting-started.md#data-quality-get-started-supported-source-types) 섹션을 참조하세요. | AWS Glue에서 지원하는 모든 데이터 소스(사용자 지정 커넥터 및 서드 파티 커넥터 포함). | 
| Data Quality 규칙 권장 사항 | 지원됨 | 지원되지 않음 | 
| DQDL 규칙 작성 및 실행 | 지원됨 | 지원됨 | 
| Auto Scaling | 지원되지 않음 | 지원됨 | 
| AWS Glue Flex 지원 | 지원되지 않음 | 지원됨 | 
| 일정 예약 | Step Functions를 통해 데이터 품질 규칙을 평가할 때 지원됩니다. | Step Functions와 워크플로를 사용할 때 지원됩니다. | 
| 데이터 품질 검사에 실패한 레코드 식별 | 지원되지 않음 | 지원됨 | 
| Amazon EventBridge와 통합 | 지원됨 | 지원됨 | 
| AWS Cloudwatch와 통합 | 지원됨 | 지원됨 | 
| Amazon S3에 데이터 품질 결과 작성 | 지원됨 | 지원됨 | 
| 증분 데이터 품질 | 푸시다운 조건자를 통해 지원됨 | AWS Glue 북마크를 통해 지원됨 | 
| AWS CloudFormation 지원 | 지원됨 | 지원됨 | 
| ML 기반 이상 탐지 | 지원되지 않음 | 지원됨 | 
| 동적 규칙 | 지원되지 않음 | 지원됨 | 

## 고려 사항
<a name="glue-data-quality-considerations"></a>

AWS Glue Data Quality를 사용하기 전에 다음을 고려합니다.
+ 데이터 품질 규칙은 중첩된 데이터 소스 또는 목록 유형 데이터 소스를 평가할 수 없습니다. [중첩된 구조체 평면화](transforms-flatten.md)을(를) 참조하세요.

## 용어
<a name="data-quality-terms"></a>

다음 목록은 AWS Glue 데이터 품질 관련 용어를 정의합니다.

**DQDL(데이터 품질 정의 언어)**  
AWS Glue 데이터 품질 규칙을 작성하는 데 사용할 수 있는 도메인별 언어입니다.  
DQDL에 대한 자세한 내용은 [데이터 품질 정의 언어(DQDL) 참조](dqdl.md) 안내서를 참조하세요.

**데이터 품질 **  
데이터 세트가 특정 목적에 얼마나 적합한지를 설명합니다. AWS Glue 데이터 품질은 데이터 세트를 기준으로 규칙을 평가하여 데이터 품질을 측정합니다. 각 규칙은 데이터 최신성 또는 무결성과 같은 특정 특성을 확인합니다. 데이터 품질을 정량화하려면 **데이터 품질 점수를 사용할 수 있습니다.

**데이터 품질 점수**  
AWS Glue 데이터 품질로 규칙 세트를 평가할 때 통과한 데이터 품질 규칙(true 결과)의 비율입니다.

**규칙**  
데이터에 특정 특성이 있는지 검사하고 부울 값을 반환하는 DQDL 표현식입니다. 자세한 내용은 [규칙 구조](dqdl.md#dqdl-syntax-rule-structure) 섹션을 참조하세요.

**분석기**  
데이터 통계를 수집하는 DQDL 표현식입니다. 분석기는 시간이 지남에 따라 ML 알고리즘이 이상과 탐지하기 어려운 데이터 품질 문제를 탐지하는 데 사용할 수 있는 데이터 통계를 수집합니다.

**규칙 세트**  
일련의 데이터 품질 규칙으로 구성된 AWS Glue 리소스입니다. 규칙 세트는 AWS Glue Data Catalog의 테이블과 연결되어야 합니다. 규칙 세트를 저장할 때 AWS Glue에서는 Amazon 리소스 이름(ARN)을 규칙 세트에 할당합니다.

**데이터 품질 점수**  
AWS Glue 데이터 품질로 규칙 세트를 평가할 때 통과한 데이터 품질 규칙(true 결과)의 비율입니다.

**관찰**  
AWS Glue에서 시간이 지남에 따라 규칙과 분석기로부터 수집된 데이터 통계를 분석하여 생성되는 확인되지 않은 인사이트입니다.

## 한도
<a name="data-quality-limits"></a>

 AWS Glue Data Quality 서비스 한도: 
+  규칙 세트에는 2,000개의 규칙을 포함할 수 있습니다. 규칙 세트가 더 크면 여러 규칙 세트로 분할하는 것이 좋습니다.
+  규칙 세트의 크기는 65KB입니다. 규칙 세트가 더 크면 여러 규칙 세트로 분할하는 것이 좋습니다.
+  AWS Glue Data Quality는 규칙 또는 분석기를 생성할 때 통계를 수집합니다. 이러한 통계를 저장하는 데는 비용이 들지 않습니다. 단, 계정당 10만 개로 통계 수가 제한되며 이러한 통계는 최대 2년간 보관됩니다.

## AWS Glue Data Quality의 릴리즈 정보
<a name="data-quality-release-notes"></a>

이 주제에서는 AWS Glue Data Quality에 도입된 기능에 대해 설명합니다.

### 정식 출시: 새 기능
<a name="data-quality-release-notes-ga"></a>

AWS Glue Data Quality의 정식 출시를 통해 다음과 같은 새로운 기능을 사용할 수 있습니다.
+ 이제 데이터 품질 검사에 실패한 레코드를 식별하는 기능이 AWS Glue Studio에서 지원됩니다.
+ 두 데이터 세트 간 데이터의 참조 무결성 검증, 두 데이터 세트 간 데이터 비교, 데이터 형식 검사와 같은 새로운 데이터 품질 규칙 유형
+ AWS Glue Data Catalog의 사용자 경험 개선
+ Apache Iceberg, Apache Hudi 및 Delta Lake에 대한 지원
+ Amazon Redshift에 대한 지원
+ Amazon EventBridge를 통한 간소화된 알림
+ 규칙 세트 생성을 위한 AWS CloudFormation 지원
+ 성능 개선: 데이터 품질 평가 시 더 빠른 성능을 제공하기 위해 ETL 및 AWS Glue Studio의 캐싱 옵션

### 2023년 11월 27일(미리 보기)
<a name="data-quality-release-notes-preview"></a>
+  ML 기반 이상 탐지 기능은 이제 AWS Glue ETL 및 AWS Glue Studio에서 사용할 수 있습니다. 이를 통해 이제 이상과 탐지하기 어려운 데이터 품질 문제를 탐지할 수 있습니다.
+  [동적 규칙을 사용하면 동적 임곗값(예: `RowCount> avg(last(10))`)을 제공할 수 있습니다. ](https://docs.aws.amazon.com/glue/latest/dg/dqdl.html#dqdl-dynamic-rules) 

### 2024년 3월 12일
<a name="data-quality-release-notes-mar12"></a>
+  DQDL 개선 사항 
  +  [ NULL, BLANKS, WHITESPACES\$1ONLY와 같은 키워드에 대한 지원 ](dqdl.md#dqdl-keywords-null-empty-whitespaces_only) 
  +  [AWS Glue 데이터 품질에서 복합 규칙을 처리하는 방법을 지정하는 옵션 ](dqdl.md#dqdl-syntax-rule-composition) 
  +  [ ColumnValues 규칙 유형에서는 비교 중에 NULL 값이 전달되는 것을 허용하지 않음 ](dqdl.md#dqdl-keywords-null-empty-whitespaces_only) 
  +  [ DQDL의 NOT 연산자에 대한 지원 ](dqdl.md#dqdl-syntax-rule-expressions) 

### 2024년 6월 26일
<a name="data-quality-release-notes-jun26"></a>
+ DQDL 개선 사항
  + DQDL은 이제 [where 절](dqdl.md#dqdl-filtering-data-in-dqdl)을 지원하므로 DQ 규칙을 적용하기 전에 데이터를 필터링할 수 있습니다.

### 2024년 8월 7일
<a name="data-quality-release-notes-aug7"></a>
+ 이제 이상 탐지 기능과 동적 규칙을 정식 버전으로 사용할 수 있습니다.

### 2024년 11월 22일
<a name="data-quality-release-notes-nov22-2024"></a>
+  [ 복잡한 복합 규칙을 사용하여 중첩을 지원하는 더 복잡한 비즈니스 규칙을 작성할 수 있음 ](https://docs.aws.amazon.com/glue/latest/dg/dqdl.html#dqdl-syntax-rule-composition) 
+  파일의 데이터 품질을 관리하기 위한 새로운 규칙 유형 
  +  [ FileFreshness ](https://docs.aws.amazon.com/glue/latest/dg/dqdl-rule-types-FileFreshness) 
  +  [ FileSize ](https://docs.aws.amazon.com/glue/latest/dg/dqdl-rule-types-FileSize) 
  +  [ FileUniqueness ](https://docs.aws.amazon.com/glue/latest/dg/dqdl-rule-types-FileUniqueness) 
  +  [ FileMatch ](https://docs.aws.amazon.com/glue/latest/dg/dqdl-rule-types-FileMatch) 
+ Visual ETL 작업의 기본 데이터 품질 검사

### 2024년 12월 6일
<a name="data-quality-release-notes-dec6-2024"></a>
+ 이제 AWS Glue Data Quality는 AWS Glue ETL 5.0에서 Amazon SageMaker AI LakeHouse 테이블과 AWS Lake Formation 관리형 Iceberg, Delta 및 HUDI 테이블을 지원합니다.

### 2025년 7월 7일
<a name="data-quality-release-notes-jul7-2025"></a>
+  이제 AWS Glue Data Quality는 AWS Glue Data Catalog에서 Amazon S3 Tables, RMS, Lakehouse 및 AWS Lake Formation 관리형 Iceberg 테이블을 지원합니다.

### 2025년 11월 21일
<a name="data-quality-release-notes-nov21-2025"></a>
+ AWS Glue Data Quality는 이제 향상된 보고를 위한 규칙 레이블 지정을 지원합니다. 특정 레이블로 결과를 쿼리하여 특정 범주 내에서 실패한 규칙을 식별하고, 팀 또는 도메인별로 규칙 결과를 계산하고, 다양한 이해관계자를 위한 집중 보고서를 생성하여 데이터 품질 결과를 보다 효과적으로 구성하고 분석할 수 있습니다. 자세한 내용은 [레이블](dqdl.md#dqdl-labels) 섹션을 참조하세요.
+ AWS Glue Data Quality가 이제 DQDL에서 상수를 지원하므로 상수 값을 정의하고 스크립트 전체에서 참조할 수 있습니다. 이는 큰 SQL 문으로 작업할 때 쿼리 크기 제한과 관련된 문제를 방지하는 데 도움이 됩니다. 자세한 내용은 [상수](dqdl.md#dqdl-constants) 섹션을 참조하세요.

# AWS Glue Data Quality의 이상 탐지
<a name="data-quality-anomaly-detection"></a>

[![AWS Videos](http://img.youtube.com/vi/https://www.youtube.com/embed/IWHzrupqlGM/0.jpg)](http://www.youtube.com/watch?v=https://www.youtube.com/embed/IWHzrupqlGM)




 엔지니어들은 수백 개의 데이터 파이프라인을 동시에 관리합니다. 각 파이프라인은 서로 다른 소스에서 데이터를 추출하여 데이터 레이크에 로드할 수 있습니다. 의사 결정을 위한 고품질 데이터를 제공하기 위해 데이터 품질 규칙을 설정합니다. 이러한 규칙은 현재 비즈니스 상태를 반영하는 고정된 기준에 따라 데이터를 평가합니다. 하지만 비즈니스 환경이 변화하면 데이터 속성이 변화하여 이러한 고정된 기준이 더 이상 맞지 않게 되고 데이터 품질이 저하됩니다.

 예를 들어 한 소매업체의 데이터 엔지니어는 일일 매출이 임계값 100만 USD를 초과하는지 검증하는 규칙을 설정했습니다. 몇 달 후 일일 매출이 200만 USD를 넘어서면서 이 임계값은 무용지물이 되었습니다. 알림이 부족하고 규칙을 수동으로 분석하고 업데이트하기가 복잡하고 번거로워, 데이터 엔지니어가 최신 임계값을 반영하도록 규칙을 업데이트할 수 없었습니다. 이달 말, 비즈니스 사용자들은 매출이 25%나 감소한 것을 확인했습니다. 몇 시간에 걸친 조사 끝에 데이터 엔지니어들은 일부 매장에서 데이터를 추출하는 ETL 파이프라인이 오류를 발생시키지 않고 실패했다는 사실을 발견했습니다. 임계값이 오래된 규칙은 이 문제를 발견하지 못한 채 계속 정상적으로 작동했습니다.

 또는 이러한 이상 현상을 탐지할 수 있는 사전 예방적 알림을 통해 사용자가 이 문제를 탐지할 수 있었을 수도 있습니다. 게다가 비즈니스의 계절성을 추적하면 심각한 데이터 품질 문제를 쉽게 찾아낼 수 있습니다. 예를 들어 소매 판매는 주말과 휴일에 가장 높지만 평일에는 상대적으로 낮을 수 있습니다. 이 패턴과 다를 경우 데이터 품질에 문제가 있거나 비즈니스 상황이 바뀐 것일 수 있습니다. 데이터 품질 규칙으로는 계절적 패턴을 탐지할 수 없습니다. 이를 위해서는 과거 패턴을 학습하여 계절적 변동을 포착함으로써 편차를 탐지할 수 있는 고급 알고리즘이 필요하기 때문입니다.

 마지막으로, 규칙 생성 프로세스의 기술적 특성과 규칙 작성에 소요되는 시간 때문에 사용자가 규칙을 생성하고 유지 관리하기가 어렵습니다. 따라서 사용자들은 규칙을 정의하기 전에 먼저 데이터 인사이트를 탐색하는 것을 선호합니다. 고객들은 이상을 쉽게 찾아내 데이터 품질 문제를 사전에 탐지하고 리스크 없이 비즈니스 의사 결정을 내릴 수 있는 기능을 필요로 합니다.

## 작동 방법
<a name="data-quality-anomaly-detection-how-it-works"></a>

**참고**  
 이상 탐지는 AWS Glue ETL에서만 지원됩니다. 데이터 카탈로그 기반 데이터 품질 솔루션에서는 지원되지 않습니다.

![\[데이터 품질 이상 탐지 프로세스를 보여주는 스크린샷.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/data-quality-anomaly-detection-process.png)


 AWS Glue Data Quality는 규칙 기반 데이터 품질의 성능과 이상 탐지 기능을 결합하여 고품질 데이터를 제공합니다. 시작하려면 먼저 규칙과 분석기를 구성한 후 이상 탐지를 활성화해야 합니다.

### 규칙
<a name="data-quality-anomaly-rules"></a>

 **규칙** - 규칙은 데이터 품질 정의 언어(DQDL)라는 개방형 언어로 데이터에 대한 기대치를 표현합니다. 아래에 규칙의 예가 나와 있습니다. 이 규칙은 `presger\$1count` 열에 빈 값이나 NULL 값이 없을 때 통과합니다.

```
Rules = [
    IsComplete "passenger_count"
]
```

### 분석기
<a name="data-quality-anomaly-analyzers"></a>

 중요 열을 알고 있지만 데이터를 잘 몰라 특정 규칙을 작성할 수 없는 경우, 분석기를 사용하여 해당 열을 모니터링할 수 있습니다. 분석기는 명시적인 규칙을 정의하지 않고도 데이터 통계를 수집할 수 있는 방법입니다. 다음 이미지는 분석기 구성 예를 보여줍니다.

```
Analyzers = [
AllStatistics "fare_amount",
DistinctValuesCount "pulocationid",
RowCount
]
```

 이 예에서는 세 개의 분석기가 구성되어 있습니다.

1.  첫 번째 분석기인 `AllStatistics “fare\$1amount”`는 `fare\$1amount `필드에 사용 가능한 모든 통계를 캡처합니다.

1.  두 번째 분석기인 `DistinctValuesCount “pulocationid”`는 `pulocationid` 열에 있는 고유 값의 개수를 캡처합니다.

1.  세 번째 분석기인 'RowCount'는 데이터 세트의 총 레코드 수를 캡처합니다.

 분석기는 복잡한 규칙을 지정하지 않고도 관련 데이터 통계를 수집할 수 있는 간단한 방법입니다. 이러한 통계를 모니터링하면 데이터 품질에 대한 인사이트를 얻고 추가 조사를 실시하거나 특정 규칙을 생성해야 하는 잠재적 문제 또는 이상을 식별할 수 있습니다.

### 데이터 통계
<a name="data-quality-anomaly-data-statistics"></a>

 AWS Glue Data Quality의 분석기와 규칙은 모두 데이터 프로필이라고도 하는 데이터 통계를 수집합니다. 이러한 통계는 데이터의 특성과 품질에 대한 인사이트를 제공합니다. 수집된 통계는 시간이 지남에 따라 AWS Glue 서비스에 저장되므로 데이터 프로필의 변경 사항을 추적하고 분석할 수 있습니다.

 적절한 API를 호출하여 이러한 통계를 쉽게 검색하고 추가 분석 또는 장기 보관용으로 Amazon S3에 기록할 수 있습니다. 이 기능을 사용하면 데이터 프로파일링을 데이터 처리 워크플로에 통합하고 수집된 통계를 데이터 품질 모니터링, 이상 탐지 등의 다양한 목적으로 활용할 수 있습니다.

 Amazon S3에 데이터 프로필을 저장하면 Amazon 객체 스토리지 서비스의 확장성, 내구성 및 비용 효율성을 활용할 수 있습니다. 또한 다른 AWS 서비스 또는 서드 파티 도구를 활용하여 데이터 프로필을 분석 및 시각화할 수 있으므로, 데이터 품질에 대한 심층적인 인사이트를 얻고 데이터 관리 및 거버넌스와 관련하여 정보에 입각한 결정을 내릴 수 있습니다.

 다음은 시간 경과에 따라 저장되는 데이터 통계의 예입니다.

![\[이 스크린샷은 시간 경과에 따른 데이터 품질 통계의 선형 그래프를 보여줍니다.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/data-quality-data-statistics-over-time.png)


**참고**  
 AWS Glue Data Quality는 동일한 열에 **규칙**과 **분석기**를 모두 사용하는 경우에도 통계를 한 번만 수집하므로 통계 생성 프로세스가 효율적입니다.

### 이상 탐지
<a name="data-quality-anomaly-observation-detection"></a>

 AWS Glue Data Quality가 이상 현상을 탐지하는 데에는 최소 3개의 데이터 포인트가 필요합니다. 기계 학습 알고리즘을 활용하여 과거 추세를 학습한 다음 미래 값을 예측합니다. 실제 값이 예측 범위 안에 있지 않은 경우 AWS Glue Data Quality는 이상 관찰 항목을 생성합니다. 실제 값과 추세를 시각적으로 보여줍니다. 아래 그래프에는 네 가지 값이 표시됩니다.

![\[이 스크린샷은 시간 경과에 따른 데이터 품질 이상 탐지의 선형 그래프를 보여줍니다.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/data-quality-anomaly-detection-trend.png)


1.  실제 통계 및 시간 경과에 따른 추세입니다.

1.  실제 추세를 학습하여 도출된 추세입니다. 추세 방향을 파악하는 데 유용합니다.

1.  통계의 가능한 상한입니다.

1.  통계의 가능한 하한입니다.

1.  향후 이러한 문제를 탐지할 수 있는 권장 데이터 품질 규칙입니다.

 이상과 관련하여 유의해야 할 몇 가지 중요한 사항이 있습니다.
+  이상이 생성되어도 데이터 품질 점수는 영향을 받지 않습니다.
+  이상이 탐지되면 후속 실행에서는 정상으로 간주됩니다. 명시적으로 제외하지 않는 한, 기계 학습 알고리즘은 이 이상 값을 입력으로 간주합니다.

### 재훈련
<a name="data-quality-anomaly-detection-retraining"></a>

 이상을 정확하게 탐지하려면 이상 탐지 모델을 재훈련하는 것이 중요합니다. 이상이 탐지되면 AWS Glue Data Quality는 모델의 이상 항목을 정상 값으로 포함합니다. 이상 탐지가 정확하게 작동하도록 하려면 이상 항목을 승인하거나 거부하여 피드백을 제공하는 것이 중요합니다. AWS Glue Data Quality는 AWS Glue Studio와 API 모두에서 모델에 피드백을 제공하는 메커니즘을 제공합니다. 자세한 내용은 [AWS Glue ETL 파이프라인에서 이상 탐지](data-quality-configuring-anomaly-detection-etl-jobs.md)를 설정하는 방법에 대한 설명서를 참조하세요.

## 이상 탐지 알고리즘의 세부 정보
<a name="data-quality-anomaly-detection-algorithm"></a>
+  이상 탐지 알고리즘은 시간 경과에 따른 데이터 통계를 조사합니다. 이 알고리즘은 사용 가능한 모든 데이터 포인트를 고려하고 명시적으로 제외된 통계는 무시합니다.
+  이러한 데이터 통계는 AWS Glue 서비스에 저장되며, 이를 암호화하기 위한 AWS KMS 키를 제공할 수 있습니다. AWS Glue Data Quality 통계를 암호화하기 위한 AWS KMS 키를 제공하는 방법은 보안 가이드를 참조하세요.
+  시간 구성 요소는 이상 탐지 알고리즘에 매우 중요합니다. AWS Glue Data Quality는 과거 값을 기반으로 상한과 하한을 결정합니다. 이 결정 과정에서 시간 구성 요소를 고려합니다. 1분 간격, 1시간 간격 또는 하루 간격으로 값이 같아도 한도가 달라집니다.

### 계절성 캡처
<a name="data-quality-anomaly-capturing-seasonality"></a>

 AWS Glue Data Quality의 이상 탐지 알고리즘은 계절적 패턴을 캡처할 수 있습니다. 예를 들어 평일 패턴이 주말 패턴과 다르다는 것을 이해할 수 있습니다. 이는 AWS Glue Data Quality가 데이터 값의 계절적 추세를 탐지하는 아래 예에서 확인할 수 있습니다. 이 기능을 활성화하는 데 별도의 조치가 필요하지 않습니다. AWS Glue Data Quality는 시간 경과에 따라 계절적 추세를 학습하고 이러한 패턴을 벗어나면 이상을 탐지합니다.

![\[이 스크린샷에는 계절적 추세를 캡처할 때 발생하는 이상을 보여주는 데이터가 포함된 데이터 품질 탭이 나와 있습니다.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/data-quality-capturing-seasonality.png)


### 비용
<a name="data-quality-anomaly-detection-cost"></a>

 이상을 탐지하는 데 걸리는 시간을 기준으로 요금이 부과됩니다. 모든 통계에는 이상을 탐지하는 데 소요되는 시간을 기준으로 1 DPU의 요금이 부과됩니다. 자세한 예는 [AWS Glue 요금](https://aws.amazon.com/glue/pricing/)을 참조하세요.

### 주요 고려 사항
<a name="data-quality-anomaly-detection-considerations"></a>

 통계를 저장하는 데에는 요금이 발생하지 않습니다. 단, 계정당 통계는 10만 건으로 제한됩니다. 이러한 통계는 최대 2년간 저장됩니다.

# AWS Glue Data Quality에 대한 IAM 권한 구성
<a name="data-quality-authorization"></a>

이 주제에서는 IAM 관리자가 AWS Glue Data Quality에 대한 AWS Identity and Access Management(IAM) 정책에서 사용할 수 있는 작업과 리소스를 이해하는 데 도움이 되는 정보를 제공합니다. 또한 AWS Glue 데이터 카탈로그와 함께 AWS Glue Data Quality를 사용하는 데 필요한 최소 권한이 포함된 샘플 IAM 정책도 포함되어 있습니다.

AWS Glue의 보안에 대한 자세한 내용은 [AWS Glue의 보안](security.md)을(를) 참조하세요.

## AWS Glue Data Quality에 대한 IAM 권한
<a name="data-quality-authorization-permissions"></a>

다음 테이블에는 특정 AWS Glue Data Quality 작업을 수행하는 데 필요한 권한이 나와 있습니다. AWS Glue Data Quality에 대한 세분화된 권한 부여를 설정하려면 IAM 정책 명령문의 `Action` 요소에서 이러한 작업을 지정할 수 있습니다.


**AWS Glue 데이터 품질 작업**  

| 작업 | 설명 | 조건 키 | 
| --- | --- | --- | 
| glue:CreateDataQualityRuleset | 데이터 품질 규칙 세트를 생성할 수 있는 권한을 부여합니다. | ::dataQualityRuleset/<name> | 
| glue:DeleteDataQualityRuleset | 데이터 품질 규칙 세트를 삭제할 수 있는 권한을 부여합니다. | ::dataQualityRuleset/<name> | 
| glue:GetDataQualityRuleset | 데이터 품질 규칙 세트를 검색할 수 있는 권한을 부여합니다. | ::dataQualityRuleset/<name> | 
| glue:ListDataQualityRulesets | 모든 데이터 품질 규칙 세트를 검색할 수 있는 권한을 부여합니다. | ::dataQualityRuleset/\$1 | 
| glue:UpdateDataQualityRuleset | 데이터 품질 규칙 세트를 업데이트할 수 있는 권한을 부여합니다. | ::dataQualityRuleset/<name> | 
| glue:GetDataQualityResult |  데이터 품질 작업 실행 결과를 검색할 수 있는 권한을 부여합니다. 이 IAM 작업은 다음 API에 대한 권한도 제공합니다.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/data-quality-authorization.html)  | ::dataQualityRuleset/<name> | 
| glue:ListDataQualityResults | 모든 데이터 품질 작업 실행 결과를 검색할 수 있는 권한을 부여합니다. | ::dataQualityRuleset/\$1 | 
| glue:CancelDataQualityRuleRecommendationRun | 진행 중인 데이터 품질 권장 작업 실행을 중지할 수 있는 권한을 부여합니다. | ::dataQualityRuleset/\$1 | 
| glue:GetDataQualityRuleRecommendationRun | 데이터 품질 권장 작업 실행을 검색할 수 있는 권한을 부여합니다. | ::dataQualityRuleset/\$1 | 
| glue:ListDataQualityRuleRecommendationRuns | 모든 데이터 품질 권장 작업 실행을 검색할 수 있는 권한을 부여합니다. | ::dataQualityRuleset/\$1 | 
| glue:StartDataQualityRuleRecommendationRun | 데이터 품질 권장 작업 실행을 시작할 수 있는 권한을 부여합니다. | ::dataQualityRuleset/\$1 | 
| glue:CancelDataQualityRulesetEvaluationRun | 진행 중인 데이터 품질 작업 실행을 중지할 수 있는 권한을 부여합니다. | ::dataQualityRuleset/\$1 | 
| glue:GetDataQualityRulesetEvaluationRun | 데이터 품질 작업 실행을 검색할 수 있는 권한을 부여합니다. | ::dataQualityRuleset/\$1 | 
| glue:ListDataQualityRulesetEvaluationRuns | 모든 데이터 품질 작업 실행을 검색할 수 있는 권한을 부여합니다. | ::dataQualityRuleset/\$1 | 
| glue:StartDataQualityRulesetEvaluationRun | 데이터 품질 작업 실행을 시작할 수 있는 권한을 부여합니다. | ::dataQualityRuleset/<name> | 
| glue:PublishDataQuality | 데이터 품질 결과를 게시할 수 있는 권한을 부여합니다. | ::dataQualityRuleset/<name> | 
| glue:GetDataQualityModel | 데이터 품질 모델을 검색할 수 있는 권한을 부여합니다. | ::dataQualityRuleset/<name>, ::job/<name>  | 
| glue:GetDataQualityModelResult | 데이터 품질 모델 결과를 검색할 수 있는 권한을 부여합니다. | ::dataQualityRuleset/<name>, ::job/<name>  | 
| glue:PutDataQualityStatisticAnnotation |  통계에 주석을 추가할 수 있는 권한을 부여합니다. 이 IAM 작업은 다음 API에 대한 권한도 제공합니다.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/data-quality-authorization.html)  | ::dataQualityRuleset/<name>, ::job/<name>  | 
| glue:PutDataQualityProfileAnnotation | 프로필의 모든 통계에 주석을 달 수 있는 권한을 부여합니다. | ::dataQualityRuleset/<name>, ::job/<name>  | 

## 평가 실행을 예약하는 데 필요한 IAM 설정
<a name="data-quality-iam-setup-evaluation-runs"></a>

### IAM 권한
<a name="data-quality-iam-setup-evaluation-runs-permissions"></a>

예약된 데이터 품질 평가를 실행하려면 권한 정책에 `IAM:PassRole` 작업을 추가해야 합니다.


**AWS EventBridge 스케줄러 필수 권한**  

| 작업 | 설명 | 조건 키 | 
| --- | --- | --- | 
| iam:PassRole | 사용자가 승인된 역할을 전달할 수 있도록 IAM에 권한을 부여합니다. | StartDataQualityRulesetEvaluationRun 직접 호출에 사용된 역할의 ARN | 

이 권한이 없으면 다음과 같은 오류가 발생합니다.

```
"errorCode": "AccessDenied"
"errorMessage": "User: arn:aws:sts::account_id:assumed-role/AWSGlueServiceRole is not 
authorized to perform: iam:PassRole on resource: arn:aws:iam::account_id:role/service-role/AWSGlueServiceRole 
because no identity-based policy allows the iam:PassRole action"
```

### IAM 신뢰할 수 있는 엔터티
<a name="data-quality-iam-setup-evaluation-runs-trusted-entities"></a>

예약된 `StartDataQualityEvaluationRun`을 생성하고 실행하려면 AWS Glue 및 AWS EventBridge 스케줄러 서비스가 신뢰할 수 있는 엔티티에 나열되어야 합니다.

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "glue.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    },
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "scheduler.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
```

------

## 예제 IAM 정책
<a name="data-quality-authorization-example-policy"></a>

AWS Glue Data Quality를 대한 IAM 역할에는 다음과 같은 유형의 권한이 필요합니다.
+ AWS Glue Data Quality 작업에 대한 권한을 통해 권장 데이터 품질 규칙을 가져오고 AWS Glue 데이터 카탈로그의 테이블에 대해 데이터 품질 작업을 실행할 수 있습니다. 이 섹션의 예제 IAM 정책에는AWS Glue Data Quality 작업에 필요한 최소 권한이 포함되어 있습니다.
+ 데이터 카탈로그 테이블 및 기본 데이터에 대한 액세스 권한을 부여하는 권한입니다. 이러한 권한은 사용 사례에 따라 다릅니다. 예를 들어 Amazon S3에서 분류하는 데이터의 경우 권한에 Amazon S3에 대한 액세스가 포함되어야 합니다.
**참고**  
이 섹션에 설명된 권한과 함께 Amazon S3 권한을 구성해야 합니다.

### 권장 데이터 품질 규칙에 필요한 최소 권한
<a name="example-policy-get-dq-rule-recommendations"></a>

이 예제 정책에는 권장 데이터 품질 규칙을 생성하는 데 필요한 권한이 포함되어 있습니다.

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "AllowGlueRuleRecommendationRunActions",
      "Effect": "Allow",
      "Action": [
        "glue:GetDataQualityRuleRecommendationRun",
        "glue:PublishDataQuality",
        "glue:CreateDataQualityRuleset"
      ],
      "Resource": "arn:aws:glue:us-east-1:111122223333:dataQualityRuleset/*"
    },
	{
     "Sid": "AllowCatalogPermissions",
     "Effect": "Allow",
     "Action": [
        "glue:GetPartitions",
        "glue:GetTable"
      ],
      "Resource": [
        "*"
      ]
    },
    {
      "Sid": "AllowS3GetObjectToRunRuleRecommendationTask",
      "Effect": "Allow",
      "Action": [
        "s3:GetObject"
      ],
      "Resource": "arn:aws:s3:::aws-glue-*"
    },
		{
			"Sid": "AllowPublishingCloudwatchLogs",
			"Effect": "Allow",
			"Action": [
			  "logs:CreateLogStream",
			  "logs:CreateLogGroup",
			  "logs:PutLogEvents"
			],
			"Resource": "*"
    }
  ]
}
```

------

### 데이터 품질 작업을 실행하기 위한 최소한의 권한
<a name="example-policy-run-dq-task"></a>

이 예제 정책에는 데이터 품질 평가 작업을 실행하는 데 필요한 권한이 포함되어 있습니다.

다음 정책 설명은 사용 사례에 따라 선택 사항입니다.
+ `AllowCloudWatchPutMetricDataToPublishTaskMetrics` - 데이터 품질 실행 지표를 Amazon CloudWatch에 게시하려는 경우 필요합니다.
+ `AllowS3PutObjectToWriteTaskResults` - 데이터 품질 실행 결과를 Amazon S3에 기록하려는 경우 필요합니다.

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "AllowGlueGetDataQualityRuleset",
      "Effect": "Allow",
      "Action": [
        "glue:GetDataQualityRuleset"
      ],
      "Resource": "arn:aws:glue:us-east-1:111122223333:dataQualityRuleset/YOUR-RULESET-NAME"
    },
    {
      "Sid": "AllowGlueRulesetEvaluationRunActions",
      "Effect": "Allow",
      "Action": [
        "glue:GetDataQualityRulesetEvaluationRun",
        "glue:PublishDataQuality"
      ],
      "Resource": "arn:aws:glue:us-east-1:111122223333:dataQualityRuleset/*"
    },
    {
      "Sid": "AllowCatalogPermissions",
      "Effect": "Allow",
      "Action": [
        "glue:GetPartitions",
        "glue:GetTable"
      ],
      "Resource": [
        "*"
      ]
    },
    {
      "Sid": "AllowS3GetObjectForRulesetEvaluationRun",
      "Effect": "Allow",
      "Action": [
        "s3:GetObject"
      ],
      "Resource": "arn:aws:s3:::aws-glue-*"
    },
    {
      "Sid": "AllowCloudWatchPutMetricDataToPublishTaskMetrics",
      "Effect": "Allow",
      "Action": [
        "cloudwatch:PutMetricData"
      ],
      "Resource": "*",
      "Condition": {
        "StringEquals": {
          "cloudwatch:namespace": "Glue Data Quality"
        }
      }
    },
    {
      "Sid": "AllowS3PutObjectToWriteTaskResults",
      "Effect": "Allow",
      "Action": [
        "s3:PutObject*"
      ],
      "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*"
    }
  ]
}
```

------

### 데이터 품질 ETL 작업을 실행하기 위한 최소 권한
<a name="example-policy-run-dq-etl-job"></a>

 이 예제 정책에는 데이터 품질 ETL 작업을 실행하는 데 필요한 권한이 포함되어 있습니다.

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "AllowGluePublishDataQualityResult",
      "Effect": "Allow",
      "Action": [
        "glue:PublishDataQuality"
      ],
      "Resource": "arn:aws:glue:us-east-1:111122223333:dataQualityRuleset/*"
    },
    {
      "Sid": "AllowGlueGetDataQualityResult",
      "Effect": "Allow",
      "Action": [
        "glue:GetDataQualityResult"
      ],
      "Resource": "arn:aws:glue:us-east-1:111122223333:dataQualityRuleset/*"
    },
    {
      "Sid": "AllowGlueDataQualityStatisticAnnotation",
      "Effect": "Allow",
      "Action": [
        "glue:PutDataQualityStatisticAnnotation"
      ],
      "Resource": [
        "arn:aws:glue:us-east-1:111122223333:dataQualityRuleset/*",
        "arn:aws:glue:us-east-1:111122223333::job/{JobName}"
      ]
    },
    {
      "Sid": "AllowGlueDataQualityProfileAnnotation",
      "Effect": "Allow",
      "Action": [
        "glue:PutDataQualityProfileAnnotation"
      ],
      "Resource": [
        "arn:aws:glue:us-east-1:111122223333:dataQualityRuleset/*",
        "arn:aws:glue:us-east-1:111122223333::job/{JobName}"
      ]
    }
	]
}
```

------

# Data Catalog에서 AWS Glue Data Quality 시작하기
<a name="data-quality-getting-started"></a>

 이  시작하기 섹션에서는 AWS Glue 콘솔에서 AWS Glue Data Quality를 시작하는 데 도움이 되는 지침을 제공합니다. 데이터 품질 규칙 권장 사항 생성, 데이터에 대한 규칙 세트 평가와 같은 필수 작업을 완료하는 방법을 알아봅니다.

**Topics**
+ [사전 조건](#data-quality-prereqs)
+ [단계별 예제](#data-quality-step-by-step-example)
+ [규칙 권장 사항 생성](#data-quality-get-recommendations)
+ [모니터링 규칙 권장 사항](#data-quality-monitor-recommendations)
+ [권장 규칙 세트 편집](#data-quality-edit-ruleset)
+ [새 규칙 세트 생성](#data-quality-create-ruleset)
+ [규칙 세트를 실행하여 데이터 품질 평가](#data-quality-run-data-quality-task)
+ [데이터 품질 점수 및 결과 보기](#data-quality-view-results)
+ [전처리 쿼리 사용](#data-quality-preprocessing-queries)
+ [지원되는 소스 유형](#data-quality-get-started-supported-source-types)
+ [관련 주제](#data-quality-get-started-related)

## 사전 조건
<a name="data-quality-prereqs"></a>

 AWS Glue Data Quality를 사용하기 전에 AWS Glue에서 Data Catalog 및 크롤러를 사용하는 방법을 숙지해야 합니다. AWS Glue Data Quality를 사용하여 Data Catalog 데이터베이스의 테이블 품질을 평가할 수 있습니다. 또한 다음 항목이 필요합니다.
+  데이터 품질 규칙 세트를 평가하기 위한 Data Catalog의 테이블.
+  규칙 권장 사항을 생성하거나 데이터 품질 작업을 실행할 때 제공하는 AWS Glue의 IAM 역할. 이 역할에는 다양한 AWS Glue Data Quality 프로세스를 대신 실행하는 데 필요한 리소스에 대한 액세스 권한이 있어야 합니다. 이러한 리소스에는 AWS Glue, Amazon S3, IAM, CloudWatch가 포함됩니다. AWS Glue Data Quality에 대한 최소 권한이 포함된 정책 예제를 보려면 [예제 IAM 정책](data-quality-authorization.md#data-quality-authorization-example-policy) 섹션을 참조하세요.

   AWS Glue의 IAM 역할에 대한 자세한 내용은 [AWS Glue 서비스를 위한 IAM 정책 생성](https://docs.aws.amazon.com/glue/latest/dg/create-service-policy.html) 및 [AWS Glue 서비스를 위한 IAM 역할 생성](https://docs.aws.amazon.com/glue/latest/dg/create-an-iam-role.html)을 참조하세요. [AWS Glue Data Quality 작업에 대한 권한](https://docs.aws.amazon.com/glue/latest/dg/data-quality-authorization.html)에서 데이터 품질과 관련된 모든 AWS Glue 권한 목록을 볼 수도 있습니다.
+  다양한 데이터를 포함하는 테이블이 하나 이상 있는 데이터베이스. 이 자습서에서 사용되는 테이블의 이름은 `yyz-tickets`이며, `tickets` 테이블도 있습니다. 이 데이터는 토론토시가 주차 위반 고지서에서 공개적으로 이용할 수 있는 정보의 컬렉션입니다. 테이블을 직접 생성하는 경우 가장 적합한 권장 규칙 세트를 가져올 수 있도록 테이블에 다양한 유효한 데이터를 입력해야 합니다.

## 단계별 예제
<a name="data-quality-step-by-step-example"></a>

 샘플 데이터 세트가 포함된 단계별 예제는 [AWS Glue Data Quality 블로그 게시물](https://aws.amazon.com/blogs/big-data/getting-started-with-aws-glue-data-quality-from-the-aws-glue-data-catalog/)을 참조하세요.

## 규칙 권장 사항 생성
<a name="data-quality-get-recommendations"></a>

 규칙 권장을 사용하면 코드를 작성하지 않고도 데이터 품질을 쉽게 시작할 수 있습니다. AWS Glue Data Quality를 사용하면 데이터를 분석하고, 규칙을 식별하며, 데이터 품질 작업에서 평가할 수 있는 규칙 세트를 생성할 수 있습니다. 권장 사항 실행은 90일 후에 자동으로 삭제됩니다.

**데이터 품질 규칙 권장 사항을 생성하려면**

1.  [https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/)에서 AWS Glue 콘솔을 엽니다.

1.  탐색 창에서 **Tables**(테이블)을 선택합니다. 그런 다음 데이터 품질 규칙 권장 사항을 생성할 테이블을 선택합니다.

1.  테이블 세부 정보 페이지에서 **데이터 품질** 탭을 선택하여 테이블의 AWS Glue Data Quality 규칙 및 설정에 액세스합니다.

1.  **데이터 품질** 탭에서 **규칙 추가 및 데이터 품질 모니터링**을 선택합니다.

1.  규칙 권장 사항이 실행되지 않는 경우 **규칙 세트 빌더** 페이지의 페이지 상단에 권장 작업을 시작하라는 경보가 표시됩니다.

1.  **권장 규칙**을 선택하여 모달을 열고 권장 작업의 파라미터를 입력합니다.

1.  AWS Glue에 액세스할 수 있는 IAM 역할을 선택합니다. 이 역할에는 다양한 AWS Glue 데이터 품질 프로세스를 대신 실행하는 데 필요한 리소스에 대한 액세스 권한을 부여해야 합니다.

1.  기본 설정에 따라 필드를 작성한 후 **권장 규칙**을 선택하여 권장 작업 실행을 시작합니다. 권장 실행이 진행 중이거나 완료된 경우 이 알림에서 실행을 관리할 수 있습니다. 상태 변경을 보려면 알림을 새로 고쳐야 할 수 있습니다. 완료된 권장 작업 실행과 진행 중인 권장 작업 실행은 지난 90일 동안의 권장 사항 실행을 모두 나열하는 **실행 기록** 페이지에 표시됩니다.

### 권장 규칙의 의미
<a name="data-quality-recommend-rules"></a>

 AWS Glue Data Quality는 입력 테이블의 각 열에 있는 데이터를 기반으로 규칙을 생성합니다. 그리고 규칙을 사용하여 품질 요구 사항을 유지하기 위해 데이터를 필터링할 수 있는 잠재적 경계를 식별합니다. 생성된 규칙의 다음 목록에는 규칙의 의미와 데이터에 적용할 때 규칙이 어떤 역할을 할 수 있는지 이해하는 데 유용한 예제가 포함되어 있습니다.

 생성된 데이터 품질 정의 언어(DQDL) 규칙 유형의 전체 목록은 [DQDL 규칙 유형 참조](https://docs.aws.amazon.com/glue/latest/dg/dqdl.html#dqdl-rule-types)를 참조하세요.
+  `IsComplete "SET_FINE_AMOUNT"` - `IsComplete` 규칙은 해당 행에 열이 채워졌는지 확인합니다. 이 규칙을 사용하여 데이터에서 열에 선택 사항이 아닌 항목으로 태그를 지정합니다.
+  `Uniqueness "TICKET_NUMBER" > 0.95` - `Uniqueness` 규칙은 열 내 데이터가 고유성 임곗값을 충족하는지 확인합니다. 이 예제에서는 `"TICKET_NUMBER"`에 대해 해당 행을 채우는 데이터가 나머지 모든 행의 콘텐츠와 최대 95% 동일하다고 확인되었으며, 이에 따라 이 규칙을 제안합니다.
+  `ColumnValues "PROVINCE" in ["ON", "QC", "AB", "NY",...]` - `ColumnValues` 규칙은 기존 열 콘텐츠를 기반으로 열의 유효한 값을 정의합니다. 이 예제에서 각 행의 데이터는 state 또는 province에 대한 2자리 라이선스 코드입니다.
+  `ColumnLength "INFRACTION_DESCRIPTION" between 15 and 31` - 이 `ColumnLength` 규칙은 열 데이터에 길이 제한을 적용합니다. 이 규칙은 문자열 열에 기록된 최소 및 최대 길이를 기반으로 샘플 데이터에서 생성됩니다.

## 모니터링 규칙 권장 사항
<a name="data-quality-monitor-recommendations"></a>

 데이터 품질 규칙 권장 작업이 실행 중이면 **규칙 추가 및 데이터 품질 모니터링** 페이지에 상단 표시줄에서 사용할 수 있는 정보와 추가 작업이 표시됩니다.

 규칙 권장 작업이 진행 중인 경우 권장 작업이 완료되기 전에 **실행 중지**를 선택할 수 있습니다. 작업이 진행 중인 동안에는 **진행 중** 상태가 나타나고, 실행이 시작된 날짜 및 시간이 표시됩니다.

 규칙 권장 작업이 완료되면 규칙 권장 사항 표시줄에 권장된 규칙 수, 마지막 권장 실행 상태, 완료 날짜 및 타임스탬프가 표시됩니다.

 **규칙 권장 사항 삽입**을 선택하여 권장 규칙을 추가할 수 있습니다. 이전의 권장 규칙을 보려면 특정 날짜를 선택합니다. 새 권장 작업을 실행하려면 **추가 작업**을 선택하고 **권장 규칙**을 선택합니다.

 **사용자 설정 관리**를 선택하여 기본 설정을 지정합니다. Amazon S3의 기본 경로를 설정하여 규칙 세트를 저장하거나 데이터 카탈로그를 실행하기 위한 기본 역할을 설정할 수 있습니다.

## 권장 규칙 세트 편집
<a name="data-quality-edit-ruleset"></a>

AWS Glue Data Quality는 사용 가능한 기존 데이터를 기반으로 규칙을 생성하므로 자동 제안에서 예상치 못한 규칙 또는 바람직하지 않은 규칙이 표시될 수 있습니다. 권장 규칙 세트를 최대한 활용하려면 규칙 세트를 평가하고 수정해야 합니다. 자습서의 이 단계에서는 이전 단계에서 생성한 규칙을 가져와 이를 조정하여 일부 데이터에 더 제한적인 품질을 적용합니다. 또한 나중에 정확하고 고유한 데이터를 추가할 수 있도록 다른 규칙을 완화할 수도 있습니다.

**제안된 규칙 세트 편집**

1.  AWS Glue 콘솔에서 **데이터 카탈로그**를 선택하고 탐색 창에서 **데이터베이스 테이블**을 선택합니다. `tickets` 테이블을 선택합니다.

1. 테이블 세부 정보 페이지에서 **데이터 품질** 탭을 선택하여 테이블의 AWS Glue Data Quality 규칙 및 설정에 액세스합니다.

1.  **규칙 세트** 섹션에서는 [규칙 권장 사항 생성](#data-quality-get-recommendations)에서 생성된 규칙 세트를 선택합니다.

1.  **작업**을 선택한 다음 콘솔 창에서 **편집**을 선택합니다. 규칙 세트 편집기가 콘솔에 로드됩니다. 여기에는 규칙을 위한 편집 창과 DQDL에 대한 빠른 참조가 포함되어 있습니다.

1. 스크립트의 `2`번째 줄을 제거합니다. 이렇게 하면 데이터베이스 크기를 특정 행 수로 제한해야 하는 요구 사항이 완화됩니다. 편집 후에는 파일의 1\$13번째 줄에 다음을 포함해야 합니다.

   ```
   Rules = [
       IsComplete "TAG_NUMBER_MASKED",
       ColumnLength "TAG_NUMBER_MASKED" between 6 and 9,
   ```

1. 스크립트의 `25`번째 줄을 제거합니다. 이렇게 하면 기록된 province의 96%가 `ON`이어야 한다는 요구 사항이 완화됩니다. 편집 후에는 파일의 `24`번째 줄부터 규칙 세트 끝까지 다음을 포함해야 합니다.

   ```
   ColumnValues "PROVINCE" in ["ON", "QC", "AB", "NY", "AZ", "NS", "BC", "MI", "PQ", "MB", "PA", "FL", "SK", "NJ", "OH", "NB", "IL", "MA", "CA",
       "VA", "TX", "NF", "MD", "PE", "CT", "NC", "GA", "IN", "OR", "MN", "TN", "WI", "KY", "MO", "WA", "NH", "SC", "CO", "OK", "VT", "RI", "ME", "AL",
       "YT", "IA", "DE", "AR", "LA", "XX", "WV", "MT", "KS", "NT", "DC", "NV", "NE", "UT", "MS", "NM", "ID", "SD", "ND", "AK", "NU", "GO", "WY", "HI"],
   ColumnLength "PROVINCE" = 2
   ]
   ```

1. `14`번째 줄을 다음과 같이 변경합니다.

   ```
   IsComplete "TIME_OF_INFRACTION",
   ```

    이렇게 하면 데이터베이스를 기록된 위반 시간이 포함된 티켓으로만 제한함으로써 열의 요구 사항이 *강화*됩니다. 기록된 위반 시간이 없는 티켓은 항상 이 데이터 세트에서 유효하지 않은 데이터로 간주해야 합니다. 추가 데이터를 사용하거나 검사하여 품질 규칙을 결정하려고 할 때 파티셔닝 또는 변환이 더 적합한 경우와는 상황이 다릅니다.

1. 콘솔 페이지 하단에서 **규칙 세트 업데이트**를 선택합니다.

## 새 규칙 세트 생성
<a name="data-quality-create-ruleset"></a>

 규칙 세트는 데이터를 기준으로 평가하는 데이터 품질 규칙의 그룹입니다. AWS Glue 콘솔에서 데이터 품질 정의 언어(DQDL)를 사용하여 사용자 지정 규칙 세트를 작성할 수 있습니다.

**데이터 품질 규칙 세트를 생성하려면**

1.  AWS Glue 콘솔에서 **데이터 카탈로그**를 선택하고 **데이터베이스**를 선택한 다음 탐색 창에서 **테이블**을 선택합니다. `tickets` 테이블을 선택합니다.

1. **Data quality**(데이터 품질) 탭을 엽니다.

1.  **규칙** 섹션에서 **규칙 생성**을 선택합니다. DQDL 편집기가 콘솔에서 실행됩니다. 여기에는 직접 편집할 수 있는 텍스트 영역과 DQDL 규칙 및 테이블 스키마에 대한 빠른 참조가 포함되어 있습니다.

1.  DQDL 편집기의 텍스트 영역에 규칙을 추가하기 시작합니다. 이 자습서에서 직접 규칙을 작성하거나 데이터 품질 규칙 편집기의 **DQDL 규칙 빌더** 기능을 사용할 수 있습니다.
**참고**  
 목록에서 규칙 유형을 선택하고 더하기 기호를 선택하여 편집기 창에 예제 구문을 삽입합니다.
자리 표시자 열 이름을 자신의 열 이름으로 변경합니다. 테이블의 열 이름은 **스키마** 탭에서 사용할 수 있습니다.
 상황에 맞게 표현식 파라미터를 업데이트합니다. DQDL이 지원하는 전체 표현식 목록은 [Expressions](dqdl.md#dqdl-syntax-rule-expressions) 섹션을 참조하세요.

    예를 들어 다음 규칙은 `tickets` 테이블의 `ticket_number` 열에 대한 데이터 검증과 관련된 제약 조건입니다. 다음 규칙을 추가하려면 DQDL 규칙 빌더를 사용하거나 규칙 세트를 직접 편집합니다.

   ```
   IsComplete "ticket_number",
   IsUnique "ticket_number",
   ColumnValues "ticket_number" > 9000000000
   ```

1. **규칙 세트 이름** 필드에 새 규칙 세트의 이름을 제공합니다.

1. **규칙 세트 저장**을 선택합니다.

### 여러 데이터 세트에서 데이터 품질 평가
<a name="data-quality-create-ruleset-referential-integrity"></a>

 ReferentialIntegrity 및 DatasetMatch 규칙 세트를 사용하여 여러 데이터 세트에서 데이터 품질 규칙을 설정할 수 있습니다. ReferentialIntegrity는 기본 데이터 세트의 데이터가 다른 데이터 세트에 있는지 검사합니다.

참조 데이터 세트를 추가하려면 **스키마** 탭을 선택한 다음 **참조 테이블 업데이트**를 선택합니다. 데이터베이스와 테이블을 선택하라는 메시지가 표시됩니다. 테이블을 추가한 다음 데이터 품질 규칙을 설정할 수 있습니다. AggregateMatch, RowCountMatch, ReferentialIntegrity, SchemaMatch 및 DatasetMatch와 같은 규칙 유형은 여러 데이터 세트에서 데이터 품질 검사를 수행하는 기능을 지원합니다.

## 규칙 세트를 실행하여 데이터 품질 평가
<a name="data-quality-run-data-quality-task"></a>

 데이터 품질 작업을 실행할 때 AWS Glue 데이터 품질은 데이터를 기준으로 규칙 세트를 평가하고 데이터 품질 점수를 계산합니다. 이 점수는 입력에 대해 통과한 데이터 품질 규칙의 백분율을 나타냅니다.

**데이터 품질 작업을 실행하려면**

1. AWS Glue 콘솔에서 **데이터 카탈로그**를 선택하고 **데이터베이스**를 선택한 다음 탐색 창에서 **테이블**을 선택합니다. `tickets` 테이블을 선택합니다.

1. **데이터 품질** 탭을 선택합니다.

1. **규칙 세트** 목록에서 테이블을 기준으로 평가하려는 규칙 세트를 선택합니다. 이 단계에서는 생성된 규칙 대신 이미 작성했거나 수정한 규칙 세트를 사용하는 것이 좋습니다. **실행**을 선택합니다.

1.  모달에서 IAM 역할을 선택합니다. 이 역할에는 다양한 AWS Glue 데이터 품질 프로세스를 대신 실행하는 데 필요한 리소스에 대한 액세스 권한을 부여해야 합니다. IAM 역할을 기본값으로 저장하거나 **기본 설정** 페이지로 이동하여 수정할 수 있습니다.

1.  **Data quality actions**(데이터 품질 작업)에서 **Publish metrics to Amazon CloudWatch**(Amazon CloudWatch에 지표 게시) 여부를 선택합니다. 이 옵션을 선택하면 AWS Glue Data Quality는 통과한 규칙 수와 실패한 규칙 수를 나타내는 지표를 게시합니다. 이러한 방식으로 저장된 지표에 대해 작업을 수행하기 위해 CloudWatch 경보를 사용할 수 있습니다. 알림을 설정할 수 있도록 주요 지표도 Amazon EventBridge에 게시됩니다. 자세한 내용은 [알림, 배포 및 예약 설정](https://docs.aws.amazon.com/glue/latest/dg/data-quality-alerts.html)을 참조하세요.

1.  **실행 빈도**에서 온디맨드로 실행을 선택하거나 규칙 세트를 예약합니다. 규칙 세트를 예약하면 작업 이름을 입력하라는 메시지가 표시됩니다. 예약은 Amazon EventBridge에서 생성됩니다. Amazon EventBridge에서 예약을 편집할 수 있습니다.

1.  Amazon S3에 데이터 품질 결과를 저장하려면 **데이터 품질 결과 위치**를 선택합니다. 이 작업을 위해 이전에 선택한 IAM 역할에는 선택한 위치에 대한 쓰기 권한이 있어야 합니다.

1.  **추가 구성** 아래에 AWS Glue에서 데이터 품질 작업에 할당할 **요청된 작업자 수**를 입력합니다.

1.  선택적으로 데이터 소스에서 필터를 설정할 수 있습니다. 이렇게 하면 읽는 데이터가 줄어듭니다. 필터를 사용하여 파티션 정보를 선택하고 API 직접 호출을 통해 해당 정보를 파라미터로 전달하여 증분 검증을 실행할 수도 있습니다. 성능 개선을 위해 파티션 조건자를 제공할 수 있습니다.

1.  **실행**을 선택합니다. **Data quality task runs**(데이터 품질 작업 실행) 목록에 새 작업이 표시됩니다. 작업의 **실행 상태** 열이 **완료됨**으로 표시되면 품질 점수 결과를 볼 수 있습니다. 상태를 올바르게 업데이트하려면 콘솔 창을 새로 고쳐야 할 수도 있습니다.

1.  데이터 품질 결과 세부 정보 열을 보려면 '\$1' 아이콘을 선택하여 규칙 세트를 확장합니다. 결과에는 평가에서 통과한 규칙과 실패한 규칙, 그리고 규칙 실패의 원인이 표시됩니다.

## 데이터 품질 점수 및 결과 보기
<a name="data-quality-view-results"></a>

**생성된 모든 규칙 세트의 최신 실행을 보려면**

1.  AWS Glue 콘솔의 탐색 창에서 **Tables**(테이블)을 선택합니다. 그런 다음 데이터 품질 작업을 실행할 테이블을 선택합니다.

1.  **데이터 품질** 탭을 선택합니다.

1.  **데이터 품질 스냅샷**에서는 시간 경과에 따른 일반적인 실행 추세를 보여줍니다. 기본적으로 모든 규칙 세트에 대한 마지막 10개 실행이 표시됩니다. 규칙 세트별로 필터링하려면 드롭다운 목록에서 원하는 항목을 선택합니다. 실행이 10개 미만인 경우 사용 가능한 모든 완료된 실행이 표시됩니다.

1.  **데이터 품질** 테이블에는 최근 실행 기록이 있는 각 규칙 세트(있는 경우)가 점수와 함께 표시됩니다. 규칙 세트를 확장하면 해당 규칙 세트에 있는 규칙과 해당 실행의 규칙 결과가 함께 표시됩니다.



**특정 규칙 세트의 최신 실행을 보려면**

1.  AWS Glue 콘솔의 탐색 창에서 **Tables**(테이블)을 선택합니다. 그런 다음 데이터 품질 작업을 실행할 테이블을 선택합니다.

1.  **데이터 품질** 탭을 선택합니다.

1.  **데이터 품질** 테이블에서 특정 규칙 세트를 선택합니다.

1.  **규칙 세트 세부정보** 페이지에서 **실행 기록** 탭을 선택합니다.

    이 특정 규칙 세트에 대한 모든 평가 실행이 이 탭의 테이블에 나열됩니다. 점수 기록과 실행 상태를 볼 수 있습니다.

1.  특정 실행에 대한 자세한 내용을 보려면 **실행 ID**를 선택하여 **평가 실행 세부 정보** 페이지로 이동합니다. 이 페이지에서는 실행에 대한 세부 정보와 개별 규칙 결과의 상태에 대한 자세한 내용을 볼 수 있습니다.

## 전처리 쿼리 사용
<a name="data-quality-preprocessing-queries"></a>

 AWS Glue Data Quality는 데이터 품질 검사를 실행하기 전에 데이터를 변환할 수 있는 전처리 쿼리를 지원합니다. 이 기능을 통해 다음을 수행할 수 있습니다.
+ 데이터 품질 검증을 위한 파생 열을 생성합니다.
+ 특정 조건을 기준으로 데이터를 필터링합니다.
+ 품질 검사를 위한 계산 또는 변환을 수행합니다.
+ 열 간의 관계를 검증합니다.

**참고**  
 이 기능은 API에서만 지원되며 콘솔을 통해서는 지원되지 않습니다.

### CLI 및 SDK에서 전처리 쿼리 사용
<a name="data-quality-preprocessing-queries-cli-sdk"></a>

#### 추천 실행
<a name="data-quality-preprocessing-queries-recommendation-runs"></a>

 다음 예제는 추천 실행에 전처리 쿼리를 사용하는 방법을 보여줍니다.

 **AWS CLI:** 

```
aws glue start-data-quality-rule-recommendation-run \
  --data-source '{"DataQualityGlueTable": { \
    "DatabaseName": "mydatabase", \
    "TableName": "mytable", \
    "PreProcessingQuery": "SELECT sepal_length, sepal_width, petal_length, petal_width, class, (sepal_length + sepal_width) as sepal_total FROM `mydatabase.mytable`" \
  }}' \
  --role "arn:aws:iam::123456789012:role/GlueDataQualityRole" \
  --created-ruleset-name "my-ruleset-with-preprocessing"
```

 **Java SDK:** 

```
StartDataQualityRuleRecommendationRunRequest request = new StartDataQualityRuleRecommendationRunRequest()
    .withDataSource(new DataSource()
        .withDataQualityGlueTable(new DataQualityGlueTable()
            .withDatabaseName("mydatabase")
            .withTableName("mytable")
            .withPreProcessingQuery("SELECT sepal_length, sepal_width, " + 
                "(sepal_length + sepal_width) as sepal_total " +
                "FROM `mydatabase.mytable`")))
    .withRole("arn:aws:iam::123456789012:role/GlueDataQualityRole")
    .withCreatedRulesetName("my-ruleset-with-preprocessing");

glueClient.startDataQualityRuleRecommendationRun(request);
```

#### 규칙 집합 평가 실행
<a name="data-quality-preprocessing-queries-evaluation-runs"></a>

 다음 예제는 규칙 집합 평가 실행에 전처리 쿼리를 사용하는 방법을 보여줍니다.

 **AWS CLI:** 

```
aws glue start-data-quality-ruleset-evaluation-run \
  --data-source '{"DataQualityGlueTable": { \
    "DatabaseName": "mydatabase", \
    "TableName": "mytable", \
    "PreProcessingQuery": "SELECT order_id, amount, (tax + shipping) as total_fees FROM `mydatabase.mytable`" \
  }}' \
  --role "arn:aws:iam::123456789012:role/GlueDataQualityRole" \
  --ruleset-names '["my-ruleset"]'
```

 **Java SDK:** 

```
StartDataQualityRulesetEvaluationRunRequest request = new StartDataQualityRulesetEvaluationRunRequest()
    .withDataSource(new DataSource()
        .withDataQualityGlueTable(new DataQualityGlueTable()
            .withDatabaseName("mydatabase")
            .withTableName("mytable")
            .withPreProcessingQuery("SELECT order_id, amount, " +
                "(tax + shipping) as total_fees " +
                "FROM `mydatabase.mytable`")))
    .withRole("arn:aws:iam::123456789012:role/GlueDataQualityRole")
    .withRulesetNames(Arrays.asList("my-ruleset"));

glueClient.startDataQualityRulesetEvaluationRun(request);
```

### 전처리 쿼리 작성 시 고려 사항
<a name="data-quality-preprocessing-queries-considerations"></a>

 전처리 쿼리를 작성할 때: 
+ 테이블 참조는 백틱을 사용하는 ``databaseName.tableName`` 형식으로 지정되어야 합니다.
+ 쿼리는 유효한 SELECT 문이어야 합니다.
+ 쿼리 출력의 열 이름은 데이터 품질 규칙에 사용됩니다.

 다음 예제는 전처리 쿼리를 보여줍니다.

```
SELECT 
    sepal_length, 
    sepal_width, 
    petal_length, 
    petal_width, 
    class,
    (sepal_length + sepal_width) as sepal_total 
FROM `mydatabase.mytable`
```

### 제한 사항
<a name="data-quality-preprocessing-queries-limitations"></a>
+ 쿼리는 백틱과 전체 ``databaseName.tableName`` 형식을 사용하여 테이블을 참조해야 합니다.
+ 최대 쿼리 길이는 51,200자입니다.
+ 쿼리는 하나 이상의 데이터 행을 반환해야 합니다.
+ 규칙 집합에서 참조되는 모든 열이 쿼리 출력에 있어야 합니다.

## 지원되는 소스 유형
<a name="data-quality-get-started-supported-source-types"></a>


**AWS Lake Formation 구성별 테이블 유형 지원**  

| 테이블 유형 | AWS Lake Formation - 모든 테이블 액세스 | AWS Lake Formation 열로 활성화됨 | AWS Lake Formation 데이터 필터로 활성화됨 | 교차 계정 AWS Lake Formation 지원 - 모든 테이블 액세스 | AWS Lake Formation 비활성화됨 | 
| --- | --- | --- | --- | --- | --- | 
| PARQUET | 지원됨 | 지원되지 않음 | 지원되지 않음 | 지원 | 지원됨 | 
| ORC | 지원됨 | 지원되지 않음 | 지원되지 않음 | 지원 | 지원됨 | 
| CSV, JSON, TSV | 지원됨 | 지원되지 않음 | 지원되지 않음 | 지원 | 지원됨 | 
| Avro | 지원됨 | 지원되지 않음 | 지원되지 않음 | 지원 | 지원됨 | 
| JSON | 지원됨 | 지원되지 않음 | 지원되지 않음 | 지원 | 지원됨 | 
| Iceberg | 지원됨 | 지원되지 않음 | 지원되지 않음 | 지원 | 지원됨 | 
| HUDI | 지원되지 않음 | 지원되지 않음 | 지원되지 않음 | 지원되지 않음 | 지원됨 | 
| 델타 | 지원되지 않음 | 지원되지 않음 | 지원되지 않음 | 지원되지 않음 | 지원됨 | 
| RMS | 지원\$1 | 지원\$1 | 지원\$1 | 지원되지 않음 | 지원되지 않음 | 
| Amazon S3 Tables | 지원\$1 | 지원되지 않음 | 지원되지 않음 | 해당 사항 없음 | 지원됨 | 
| Amazon RDS 및 Aurora | 해당 사항 없음 | 해당 사항 없음 | 해당 사항 없음 | 해당 사항 없음 | 지원되지 않음 | 
| JDBC | 해당 사항 없음 | 해당 사항 없음 | 해당 사항 없음 | 해당 사항 없음 | 지원됨 | 

 \$1 Amazon S3 Tables 및 SageMaker Lakehouse는 AWS Glue 콘솔에서 지원되지 않습니다. 현재 Amazon S3 Tables 및 SageMaker Lakehouse Data Catalog 권장 사항 실행 및 Data Catalog Data Quality 평가 실행은 CLI를 통해서만 지원됩니다.

### 기타 알려진 제한 사항
<a name="w2aac49c43c47b7"></a>
+  Delta Lake Symlink 테이블: AWS Glue Data Quality 권장 사항 실행 또는 Data Catalog Data Quality 평가 실행에는 지원되지 않습니다.
+  SageMaker Unifie Studio에 Amazon S3 Tables 자산 게시: 현재는 SageMaker Unified Studio에 Amazon S3 Tables를 자산으로 게시할 수 없습니다. 따라서 SageMaker Unified Studio에서 Amazon S3 Tables Data Quality 실행을 시각화할 수 없습니다.

## 관련 주제
<a name="data-quality-get-started-related"></a>
+ [DQDL 규칙 유형 참조](dqdl-rule-types.md)
+ [데이터 품질 정의 언어(DQDL) 참조](dqdl.md)

# AWS Glue Studio에서 데이터 품질 평가
<a name="data-quality-gs-studio"></a>

 AWS Glue 데이터 품질은 정의된 규칙에 따라 데이터의 품질을 평가하고 모니터링합니다. 그러면 조치가 필요한 데이터를 쉽게 식별할 수 있습니다. AWS Glue Studio에서는 시각적 작업에 데이터 품질 노드를 추가하여 데이터 카탈로그의 테이블에서 데이터 품질 규칙을 생성할 수 있습니다. 그런 다음 시간 경과에 따라 진화하는 데이터 세트의 변경 사항을 모니터링하고 평가할 수 있습니다. AWS Glue Studio에서 AWS Glue Data Quality를 사용하는 방법에 대한 개요는 다음 비디오를 참조하세요.

[![AWS Videos](http://img.youtube.com/vi/https://www.youtube.com/embed/DUd5s_CFtBM/0.jpg)](http://www.youtube.com/watch?v=https://www.youtube.com/embed/DUd5s_CFtBM)


 다음은 AWS Glue 데이터 품질을 사용하는 방법에 대한 주요 단계입니다.

1. **Create data quality rules**(데이터 품질 규칙 생성) - 구성된 기본 제공 규칙 세트를 선택하여 DQDL 빌더를 통해 데이터 품질 규칙 세트를 구축합니다.

1.  **Configure a data quality job**(데이터 품질 작업 구성) - 데이터 품질 결과 및 출력 옵션을 기반으로 작업을 정의합니다.

1.  **데이터 품질 작업 저장 및 실행** - 작업을 생성하고 실행합니다. 작업을 저장하면 해당 작업에 대해 생성한 규칙 세트가 저장됩니다.

1.  **Monitor and review the data quality results**(데이터 품질 결과 모니터링 및 검토) - 작업 실행이 완료된 후 데이터 품질 결과를 검토합니다. 원하는 경우 작업을 미래 날짜로 예약할 수 있습니다.

## 이점
<a name="gs-data-quality-benefits"></a>

 데이터 분석가, 데이터 엔지니어 및 데이터 사이언티스트는 AWS Glue Studio의 데이터 품질 평가 노드를 사용하여 시각적 작업 편집기에서 데이터 품질을 분석, 구성, 모니터링 및 개선할 수 있습니다. 데이터 품질 노드를 사용하면 다음과 같은 이점이 있습니다.
+  **데이터 품질 문제 감지 가능** - 데이터 세트의 특성을 확인하는 규칙을 생성하여 문제를 확인할 수 있습니다.
+  **간편한 시작** - 미리 구축된 규칙 및 작업으로 시작할 수 있습니다.
+  **긴밀한 통합** - AWS Glue Data Quality는 AWS Glue 데이터 카탈로그를 기반으로 실행되므로 AWS Glue Studio에서 데이터 품질 노드를 사용할 수 있습니다.

# AWS Glue Studio에서 ETL 작업에 대한 데이터 품질 평가
<a name="tutorial-data-quality"></a>

이 자습서에서는 AWS Glue Studio에서 AWS Glue Data Quality를 시작합니다. 다음 작업을 수행하는 방법에 대해 알아봅니다.
+  데이터 품질 정의 언어(DQDL) 규칙 작성기를 사용하여 규칙을 생성합니다.
+  데이터 품질 조치, 출력할 데이터 및 데이터 품질 결과의 출력 위치를 지정하는 방법 
+  데이터 품질 결과를 검토하는 방법 

 예제를 사용해 연습하려면 블로그 게시물, [https://aws.amazon.com/blogs/big-data/getting-started-with-aws-glue-data-quality-for-etl-pipelines/](https://aws.amazon.com/blogs/big-data/getting-started-with-aws-glue-data-quality-for-etl-pipelines/)를 검토하세요.

## 1단계: 시각적 작업에 데이터 품질 평가 변환 노드 추가
<a name="tutorial-data-quality-step1"></a>

이 단계에서는 시각적 작업 편집기에 데이터 품질 평가 노드를 추가합니다.

**데이터 품질 노드를 추가하려면**

1.  AWS Glue Studio 콘솔의 **작업 생성** 섹션에서 **소스 및 대상이 있는 시각적 객체**를 선택하고 **생성**을 선택합니다.

1.  데이터 품질 변환을 적용할 노드를 선택합니다. 일반적으로 변환 노드 또는 데이터 소스입니다.

1.  '\$1' 아이콘을 선택하여 왼쪽의 리소스 패널을 엽니다. 검색 표시줄에서 **데이터 품질 평가**를 검색하고 검색 결과에서 **데이터 품질 평가**를 선택합니다.

1.  시각적 작업 편집기에는 선택한 노드에서 분기되는 **데이터 품질 평가** 변환 노드가 표시됩니다. 콘솔 오른쪽에 **Transform**(변환) 탭이 자동으로 열립니다. 상위 노드를 변경해야 하는 경우 **노드 속성** 탭을 선택한 다음 드롭다운 메뉴에서 노드 상위 항목을 선택합니다.

    새 노드 상위 항목을 선택하면 상위 노드와 **Evaluate Data Quality**(데이터 품질 평가) 노드 사이에 새 연결이 설정됩니다. 원치 않는 상위 노드를 제거합니다. 각 **Evaluate Data Quality**(데이터 품질 평가) 노드에는 상위 노드를 하나만 연결할 수 있습니다.

1.  데이터 품질 평가 변환은 여러 상위 항목을 지원하므로 여러 데이터 세트에서 데이터 품질 규칙을 검증할 수 있습니다. 여러 데이터 세트를 지원하는 규칙으로는 ReferentialIntegrity, DatasetMatch, SchemaMatch, RowCountMatch, AggregateMatch가 있습니다.

   데이터 품질 평가 변환에 여러 입력을 추가할 때는 '기본' 입력을 선택해야 합니다. 기본 입력은 데이터 품질을 검증하려는 데이터 세트입니다. 다른 모든 노드 또는 입력은 참조로 처리됩니다.

   데이터 품질 평가 변환을 사용하여 데이터 품질 검사에 실패한 특정 레코드를 식별할 수 있습니다. 잘못된 레코드에 플래그를 지정하는 새 열이 기본 데이터 세트에 추가되므로 기본 데이터 세트를 선택하는 것이 좋습니다.

1.  입력 데이터 소스의 별칭을 지정할 수 있습니다. 별칭은 ReferentialIntegrity 규칙을 사용할 때 입력 소스를 참조하는 또 다른 방법을 제공합니다. 하나의 데이터 소스만 기본 소스로 지정할 수 있으므로 사용자가 추가하는 각 추가 데이터 소스에는 별칭이 필요합니다.

   다음 예제에서 ReferentialIntegrity 규칙은 별칭 이름으로 입력 데이터 소스를 지정하고 기본 데이터 소스에 대한 일대일 비교를 수행합니다.

   ```
   Rules = [
   	ReferentialIntegrity “Aliasname.name” = 1
   ]
   ```

## 2단계: DQDL을 사용하여 규칙 생성
<a name="tutorial-data-quality-step2"></a>

이 단계에서는 DQDL을 사용하여 규칙을 생성합니다. 이 자습서에서는 **완전성** 규칙 유형을 사용하여 단일 규칙을 생성합니다. 이 규칙 유형은 지정된 표현식을 기준으로 열에서 전체(null이 아닌) 값의 백분율을 검사합니다. DQDL 사용에 대한 자세한 내용은 [DQDL](https://docs.aws.amazon.com/glue/latest/dg/dqdl.html)을 참조하세요.

1.  **변환** 탭에서 **삽입** 버튼을 선택하여 **규칙 유형**을 추가합니다. 그러면 규칙 편집기에 규칙 유형이 추가되어 규칙에 대한 파라미터를 입력할 수 있습니다.
**참고**  
 규칙을 편집할 경우 규칙이 대괄호 안에 있고 쉼표로 구분되었는지 확인합니다. 예를 들어 전체 규칙 표현식은 다음과 비슷합니다.  

   ```
   Rules= [
       Completeness "year">0.8, Completeness "month">0.8
   ]
   ```
 이 예제에서는 이름이 'year' 및 'month'인 열의 완전성 파라미터를 지정합니다. 규칙이 통과되려면 이러한 열의 'complete' 비율이 80%를 초과하거나 각 열에 대해 80%가 넘는 인스턴스에 데이터가 있어야 합니다.

    이 예에서는 **Completeness**(완전성) 규칙 유형을 검색하여 삽입합니다. 그러면 규칙 유형이 규칙 편집기에 추가됩니다. 이 규칙 유형의 구문은 다음과 같습니다. `Completeness <COL_NAME> <EXPRESSION>`.

   대부분의 규칙 유형에서는 부울 응답을 생성하려면 표현식을 파라미터로 제공해야 합니다. 지원되는 DQDL 표현식에 대한 자세한 내용은 [DQDL 표현식](https://docs.aws.amazon.com/glue/latest/dg/dqdl.html#dqdl-syntax)을 참조하세요. 이제 열 이름을 추가합니다.

1.  DQDL 규칙 작성기에서 **스키마** 탭을 선택합니다. 검색 표시줄을 사용하여 입력 스키마에서 열 이름을 찾습니다. 입력 스키마는 열 이름과 데이터 유형을 표시합니다.

1.  규칙 편집기에서 규칙 유형의 오른쪽을 클릭하여 열을 삽입할 위치에 커서를 삽입합니다. 또는 규칙에 열 이름을 입력할 수 있습니다.

    예를 들어 입력 스키마 목록의 열 목록에서 열(이 예제의 경우 **year**) 옆에 있는 **삽입** 버튼을 클릭합니다. 그러면 해당 열이 규칙에 추가됩니다.

1.  그런 다음 규칙 편집기에서 규칙을 평가하는 표현식을 추가합니다. **완전성** 규칙 유형은 지정된 표현식을 기준으로 열에서 전체(null이 아닌) 값의 백분율을 검사하므로 `> 0.8`과 같은 표현식을 입력합니다. 이 규칙은 전체(null이 아닌) 값이 80%를 초과하는 경우에 열을 검사합니다.

## 3단계: 데이터 품질 출력 구성
<a name="tutorial-data-quality-step3"></a>

 데이터 품질 규칙을 생성한 후 추가 옵션을 선택하여 데이터 품질 노드 출력을 지정할 수 있습니다.

1.  **데이터 품질 변환 출력**에서 다음 옵션 중 하나를 선택합니다.
   +  **원래 데이터** - 원래 입력 데이터를 출력하려면 선택합니다. 이 옵션을 선택하면 새 하위 노드, 'rowLevelOutcomes'가 작업에 추가됩니다. 스키마는 변환에 대한 입력으로 전달된 기본 데이터 세트의 스키마와 일치합니다. 이 옵션은 데이터를 전달할 때 품질 문제가 있으면 작업을 실패시키려는 경우에 유용합니다.

     또 다른 사용 사례로, 데이터 품질 검사에 실패한 잘못된 레코드를 감지하려는 경우가 있습니다. 잘못된 레코드를 감지하려면 **데이터 품질 오류를 표시하도록 새 열 추가** 옵션을 선택합니다. 이 작업을 수행하면 'rowLevelOutcomes' 변환의 스키마에 4개의 새 열이 추가됩니다.
     +  **DataQualityRulesPass**(문자열 배열) – 데이터 품질 검사에 통과한 규칙 배열을 제공합니다.
     +  **DataQualityRulesFail**(문자열 배열) – 데이터 품질 검사에 실패한 규칙 배열을 제공합니다.
     +  **DataQualityRulesSkip**(문자열 배열) – 건너뛴 규칙 배열을 제공합니다. 다음 규칙은 데이터 세트 수준에서 적용되므로 오류 레코드를 식별할 수 없습니다.
       +  AggregateMatch 
       +  ColumnCount 
       +  ColumnExists 
       +  ColumnNamesMatchPattern 
       +  CustomSql 
       +  RowCount 
       +  RowCountMatch 
       +  StandardDeviation 
       +  평균 
       +  ColumnCorrelation 
     +  **DataQualityEvaluationResult** – 행 수준에서 '통과' 또는 '실패' 상태를 제공합니다. 전체 결과는 실패일 수 있지만 특정 레코드는 통과할 수 있습니다. 예를 들어 RowCount 규칙은 실패해도 다른 모든 규칙이 성공했을 수 있습니다. 이 경우 이 필드 상태는 '통과'입니다.

1.  **데이터 품질 결과** - 구성된 규칙과 규칙의 통과 또는 실패 상태를 출력하려면 선택합니다. 이 옵션은 결과를 Amazon S3 또는 다른 데이터베이스에 기록하려는 경우 유용합니다.

1. **데이터 품질 출력 설정**(선택 사항) - **데이터 품질 출력 설정**을 클릭하여 **데이터 품질 결과 위치** 필드를 표시합니다. 그런 다음 **찾아보기**를 클릭하여 데이터 품질 출력 대상으로 설정할 Amazon S3 위치를 검색합니다.

## 4단계. 데이터 품질 작업 구성
<a name="tutorial-data-quality-step4"></a>

 작업을 사용하여 지표를 CloudWatch에 게시하거나 특정 기준에 따라 작업을 중지할 수 있습니다. 작업은 규칙을 생성한 경우에만 사용할 수 있습니다. 이 옵션을 선택하면 동일한 지표도 Amazon EventBridge에 게시됩니다. 이러한 옵션을 사용하여 [알림용 경보를 생성](https://docs.aws.amazon.com/glue/latest/dg/data-quality-alerts.html)할 수 있습니다.
+  **규칙 세트 실패 시** - 작업 실행 중에 규칙 세트에서 실패한 경우 수행할 조치를 선택할 수 있습니다. 데이터 품질에서 실패한 경우 작업이 실패하게 하려면 다음 옵션 중 하나를 선택하여 작업이 실패해야 하는 시점을 선택합니다. 기본적으로 이 작업은 선택되지 않으며 데이터 품질 규칙에서 실패하더라도 작업 실행은 완료됩니다.
  +  **없음** – **없음**(기본값)을 선택하면 규칙 세트에서 실패했어도 작업은 실패하지 않고 계속 실행됩니다.
  +  **대상에 데이터를 로드한 후 작업 실패** - 작업이 실패하고 데이터는 저장되지 않습니다. 결과를 저장하려면 데이터 품질 결과를 저장할 Amazon S3 위치를 선택합니다.
  +  **대상 데이터를 로드하지 않고 작업 실패** - 이 옵션은 데이터 품질 오류가 발생하는 경우 즉시 작업이 실패하게 합니다. 데이터 품질 변환의 결과를 포함하여 어떠한 데이터 대상도 로드되지 않습니다.

## 5단계: 데이터 품질 결과 보기
<a name="tutorial-data-quality-step5"></a>

 작업을 실행한 후 **데이터 품질** 탭을 클릭하여 데이터 품질 결과를 확인합니다.

1.  각 작업 실행에 대해 데이터 품질 결과를 확인합니다. 각 노드에는 데이터 품질 상태와 상태 세부 정보가 표시됩니다. 노드를 선택하면 모든 규칙과 각 규칙의 상태가 표시됩니다.

1.  **결과 다운로드**를 선택하여 작업 실행 및 데이터 품질 결과에 대한 정보가 포함된 CSV 파일을 다운로드합니다.

1.  데이터 품질 결과를 포함하는 작업 실행이 두 개 이상인 경우 날짜 및 시간 범위별로 결과를 필터링할 수 있습니다. *날짜 및 시간 범위별 필터링*을 선택하여 필터 기간을 확장합니다.

1.  Relative range(상대 범위) 또는 Absolute range(절대 범위)를 선택합니다. 절대 범위의 경우 달력을 사용하여 날짜를 선택하고 시작 시간 및 종료 시간 값을 입력합니다. 완료했으면 **적용**을 선택합니다.

## 자동 데이터 품질
<a name="automatic-data-quality"></a>

 Amazon S3를 대상으로 하는 AWS Glue ETL 작업을 생성할 경우 AWS Glue ETL은 로드되는 데이터에 열이 하나 이상 있는지 확인하는 데이터 품질 규칙을 자동으로 활성화합니다. 이 규칙은 로드되는 데이터가 비어 있거나 손상되지 않았는지 확인하도록 설계되었습니다. 그러나 이 규칙이 실패하면 작업이 실패하는 것이 아니라 데이터 품질 점수가 감소합니다. 또한 이상 탐지가 기본적으로 활성화되어 데이터의 열 수를 모니터링합니다. 열 수에 변형이나 이상이 있는 경우 AWS Glue ETL은 이러한 이상에 대해 알려줍니다. 이 기능은 데이터의 잠재적 문제를 식별하고 적절한 조치를 취하는 데 도움이 됩니다. 데이터 품질 규칙 및 해당 구성을 보려면 AWS Glue ETL 작업에서 Amazon S3 대상을 클릭하면 됩니다. 제공된 스크린샷에서 볼 수 있는 것처럼, 규칙의 구성이 표시됩니다.

![\[스크린샷은 선택할 수 있는 자동 데이터 품질 옵션을 보여줍니다.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/automatic-data-quality.png)


 **데이터 품질 구성 편집**을 선택하여 추가적인 데이터 품질 규칙을 추가할 수 있습니다.

## 집계 지표
<a name="data-quality-aggregated-metrics"></a>

대시보드를 구축하려면 규칙 수준이나 규칙 세트 수준에서 통과되거나 실패하거나 건너뛴 레코드 수와 같은 집계 지표가 필요할 수 있습니다. 각 규칙에 대한 집계 지표와 규칙 지표를 가져오려면 먼저 `EvaluateDataQuality` 함수에 `publishAggregatedMetrics` 옵션을 추가하여 집계 지표를 사용하도록 설정해야 합니다.

`additional_options` `publishAggregatedMetrics`에 사용할 수 있는 옵션은 `ENABLED` 및 `DISABLED`입니다. 예를 들면 다음과 같습니다.

```
EvaluateDataQualityMultiframe = EvaluateDataQuality().process_rows(
    frame=medicare_dyf,
    ruleset=EvaluateDataQuality_ruleset,
    publishing_options={
        "dataQualityEvaluationContext": "EvaluateDataQualityMultiframe",
        "enableDataQualityCloudWatchMetrics": False,
        "enableDataQualityResultsPublishing": False,
    },
    additional_options={"publishAggregatedMetrics.status": "ENABLED"},
)
```

지정하지 않으면 `publishAggregatedMetrics.status`는 기본적으로 `DISABLED`이고 이제 ruleMetrics 및 집계 지표가 계산됩니다. 이 기능은 현재 AWS Glue 대화형 세션 및 Glue ETL 작업에서 지원됩니다. 이 기능은 Glue 카탈로그 데이터 품질 API에서 지원되지 않습니다.

### 집계 지표 결과 검색
<a name="data-quality-aggregated-metrics-results"></a>

`additionalOptions` `"publishAggregatedMetrics.status": "ENABLED"`인 경우 다음 두 장소에서 결과를 가져올 수 있습니다.

1. `AggregatedMetrics` 및 `RuleMetrics`는 `resultId`를 제공할 때 `GetDataQualityResult()`를 통해 반환됩니다. 이 때 `AggregatedMetrics` 및 `RuleMetrics`에는 다음이 포함됩니다.

   **집계 지표:**
   + 처리된 총 행 수
   + 통과된 총 행
   + 실패한 총 행
   + 처리된 총 규칙
   + 통과된 총 규칙
   + 실패한 총 규칙  
![\[스크린샷은 AWS Glue 데이터 품질 평가에 대한 집계 지표 및 규칙 지표 구조를 보여줍니다.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/data-quality-aggregated-metrics.png)

   또한 규칙 수준에서는 다음과 같은 지표가 제공됩니다.

   **규칙 지표:**
   + 통과된 행
   + 실패한 행
   + 건너뛴 행
   + 처리된 총 행

1. `AggregatedMetrics`는 추가 데이터 프레임으로 반환되고, `RuleOutcomes` 데이터 프레임은 `RuleMetrics`를 포함하도록 보강됩니다.

### 예제 구현
<a name="data-quality-aggregated-metrics-example"></a>

다음 예제는 Scala에서 집계 지표를 구현하는 방법을 보여줍니다.

```
// Script generated for node Evaluate Data Quality
val EvaluateDataQuality_node1741974822533_ruleset = """
  # Example rules: Completeness "colA" between 0.4 and 0.8, ColumnCount > 10
  Rules = [
      IsUnique "customer_identifier",
      RowCount > 10,
      Completeness "customer_identifier" > 0.5
  ]
"""

val EvaluateDataQuality_node1741974822533 = EvaluateDataQuality.processRows(frame=ChangeSchema_node1742850392012, ruleset=EvaluateDataQuality_node1741974822533_ruleset, publishingOptions=JsonOptions("""{"dataQualityEvaluationContext": "EvaluateDataQuality_node1741974822533", "enableDataQualityCloudWatchMetrics": "true", "enableDataQualityResultsPublishing": "true"}"""), additionalOptions=JsonOptions("""{"compositeRuleEvaluation.method":"ROW","observations.scope":"ALL","performanceTuning.caching":"CACHE_NOTHING", "publishAggregatedMetrics.status": "ENABLED"}"""))

println("--------------------------------ROW LEVEL OUTCOMES--------------------------------")
val rowLevelOutcomes_node = EvaluateDataQuality_node1741974822533("rowLevelOutcomes")

rowLevelOutcomes_node.show(10)

 println("--------------------------------RULE LEVEL OUTCOMES--------------------------------")

val ruleOutcomes_node = EvaluateDataQuality_node1741974822533("ruleOutcomes")

ruleOutcomes_node.show()

 println("--------------------------------AGGREGATED METRICS--------------------------------")

val aggregatedMetrics_node = EvaluateDataQuality_node1741974822533("aggregatedMetrics")

aggregatedMetrics_node.show()
```

### 샘플 결과
<a name="data-quality-aggregated-metrics-sample-results"></a>

결과는 다음과 같이 반환됩니다.

```
{
    "Rule": "IsUnique \"customer_identifier\"",
    "Outcome": "Passed",
    "FailureReason": null,
    "EvaluatedMetrics": {
        "Column.customer_identifier.Uniqueness": 1
    },
    "EvaluatedRule": "IsUnique \"customer_identifier\"",
    "PassedCount": 10,
    "FailedCount": 0,
    "SkippedCount": 0,
    "TotalCount": 10
}
{
    "Rule": "RowCount > 10",
    "Outcome": "Failed",
    "FailureReason": "Value: 10 does not meet the constraint requirement!",
    "EvaluatedMetrics": {
        "Dataset.*.RowCount": 10
    },
    "EvaluatedRule": "RowCount > 10",
    "PassedCount": 0,
    "FailedCount": 0,
    "SkippedCount": 10,
    "TotalCount": 10
}
{
    "Rule": "Completeness \"customer_identifier\" > 0.5",
    "Outcome": "Passed",
    "FailureReason": null,
    "EvaluatedMetrics": {
        "Column.customer_identifier.Completeness": 1
    },
    "EvaluatedRule": "Completeness \"customer_identifier\" > 0.5",
    "PassedCount": 10,
    "FailedCount": 0,
    "SkippedCount": 0,
    "TotalCount": 10
}
```

집계 지표는 다음과 같습니다.

```
{ "TotalRowsProcessed": 10, "PassedRows": 10, "FailedRows": 0, "TotalRulesProcessed": 3, "RulesPassed": 2, "RulesFailed": 1 }
```

# 데이터 품질 규칙 작성기
<a name="data-quality-rule-builder"></a>

데이터 품질 정의 언어(DQDL) 규칙 작성기를 사용하면 데이터 품질 규칙을 생성하여 데이터를 평가할 수 있습니다. 먼저 규칙 유형을 선택하고 규칙 편집기에서 파라미터를 지정합니다. 규칙 편집기에는 규칙을 생성할 때 발생하는 오류 및 경고도 표시됩니다.

 [DQDL 안내서](https://docs.aws.amazon.com/glue/latest/dg/dqdl.html)에서는 DQDL 구문, 기본 제공 규칙 유형 및 예제를 사용하여 규칙을 구성하는 방법에 대한 포괄적인 문서를 제공합니다.

## 데이터 품질 평가 노드
<a name="gs-data-quality-transform-expand-view"></a>

 **데이터 품질 평가** 변환 노드 및 DQDL 규칙 작성기를 사용하여 작업 공간을 확장할 수 있습니다.
+  **변환** 탭을 확장하여 전체 화면을 채우려면 노드 세부 정보 패널의 오른쪽 상단에 있는 확장 아이콘을 선택합니다.
+  DQDL 규칙 편집기를 확장하려면 **<<** 아이콘을 선택하여 규칙 편집기를 확장하고 **규칙 유형** 및 **스키마** 탭을 축소합니다.  
![\[스크린샷에는 데이터 품질 평가 노드가 있는 작업 다이어그램이 나와 있습니다.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/data_quality_example.png)

## Components
<a name="gs-data-quality-rule-builder-components"></a>

 26개의 규칙 유형이 AWS Glue Studio에 기본 제공됩니다. 각 규칙 유형에는 사용 방법에 대한 설명과 예제가 있습니다.

### 데이터 품질 규칙 유형
<a name="gs-data-quality-rule-types"></a>

 AWS Glue Studio에서는 규칙을 쉽게 만들 수 있도록 기본 제공 규칙 유형을 제공합니다. 규칙 유형에 대한 자세한 내용은 [DQDL 규칙 유형 참조](https://docs.aws.amazon.com/glue/latest/dg/dqdl.html#dqdl-rule-types)를 참조하세요.

### 스키마
<a name="gs-data-quality-schema"></a>

 **Schema**(스키마) 탭에는 상위 노드의 열 이름과 데이터 유형이 표시됩니다. 여러 노드의 스키마가 표시됩니다. 입력 스키마를 보고, 열 이름을 기준으로 검색하고, 해당 열을 규칙 편집기에 삽입할 수 있습니다.

![\[스크린샷은 완전성 규칙 유형을 사용하는 전체 규칙이 있는 규칙 편집기를 보여줍니다.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/data_quality_schema.png)


### 규칙 편집기
<a name="gs-dataquality-rule-editor"></a>

 규칙 편집기는 규칙을 작성하고 편집할 수 있는 텍스트 편집기입니다. DQDL 규칙 작성기에서 규칙 유형을 선택하면 규칙 유형이 규칙 편집기에 추가됩니다. 그런 다음 텍스트를 수정하여 필요에 따라 파라미터를 지정하고 규칙을 추가하며 규칙을 편집할 수 있습니다. AWS Glue Studio에서는 규칙 편집기에서 규칙을 검증하고 오류 및 경고가 있을 경우 이를 표시합니다.

 **Errors and warnings**(오류 및 경고) 

 규칙이 DQDL 규칙 구문을 따르지 않는 경우 규칙 편집기에 오류가 있음을 나타내는 몇 가지 시각적 표시기가 나타납니다.
+  규칙 편집기는 오류가 있는 행을 오류 아이콘과 함께 빨간색으로 표시합니다.
+  규칙 편집기의 빨간색 오류 아이콘 옆에 오류 수가 표시됩니다.
+  오류가 있는 행을 선택하면 오류 설명과 위치(행 및 열)가 규칙 편집기 아래쪽에 표시됩니다.

![\[스크린샷에서는 DQDL 규칙 편집기의 1행에 오류 표시기가 표시되고 규칙 편집기 하단에 오류 수가 표시됩니다. 다음은 오류에 대한 설명입니다.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/data_quality_rule_editor_error.png)


## 
<a name="gs-data-quality-settings"></a>

 **데이터 품질 작업** 

 기본적으로 이 작업은 선택되지 않으며 데이터 품질 규칙이 실패하더라도 작업 실행이 완료됩니다.

 다음 작업 중에서 선택합니다. 작업을 사용하여 결과를 CloudWatch에 게시하거나 특정 기준에 따라 작업을 중지할 수 있습니다. 작업은 규칙을 생성한 경우에만 사용할 수 있습니다.
+  **CloudWatch에 결과 게시** - 작업을 실행할 때 결과를 CloudWatch에 추가합니다.
+  **데이터 품질이 실패하면 작업 실패** - 데이터 품질 규칙이 실패하면 결과적으로 작업도 실패합니다.

 **데이터 품질 변환 출력** 
+  **원래 데이터** - 원래 입력 데이터를 출력하려면 선택합니다. 이 옵션은 품질 문제가 감지되었을 때 작업을 중지하려는 경우에 적합합니다.
+  **데이터 품질 지표** - 구성된 규칙과 규칙의 통과 또는 실패 상태를 출력하려면 선택합니다. 이 옵션은 사용자 지정 작업을 수행하려는 경우에 유용합니다.

 **데이터 품질 출력 설정** 

 Amazon S3 위치를 데이터 품질 출력 대상으로 지정하여 데이터 품질 결과 위치를 설정합니다.

# AWS Glue ETL 작업에서 이상 탐지 구성
<a name="data-quality-configuring-anomaly-detection-etl-jobs"></a>

 AWS Glue Studio에서 이상 탐지를 시작하려면 AWS Glue Studio 작업을 열고 **데이터 품질 평가 변환**을 클릭합니다.

 이 기능을 활성화하면 AWS Glue Data Quality가 시간 경과에 따라 데이터를 분석하여 이상을 탐지합니다. 데이터에 대한 중요한 데이터 통계 및 관찰 결과를 제공하므로 식별된 이상에 대해 조치를 취할 수 있습니다.

 이 기능의 내부 작동 방식을 이해하려면 [이상 탐지](data-quality-anomaly-detection.md) 설명서를 참조하세요.

## 이상 탐지 활성화
<a name="data-quality-enabling-anomaly-detection"></a>

**AWS Glue Studio에서 이상 탐지를 활성화하려면 다음을 수행합니다.**

1.  작업에서 **Data Quality** 노드를 선택한 다음 **이상 탐지** 탭을 선택합니다. 토글하여 **이상 탐지 활성화**를 켭니다.  
![\[‘이상 탐지 활성화’가 켜져 있는 모습을 보여주는 스크린샷. 토글하여 활성화하거나 비활성화할 수 있습니다.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/data-quality-enable-anomaly-detection.png)

1.  **분석기 추가**를 선택하여 이상을 모니터링할 데이터를 정의합니다. 입력할 수 있는 두 가지 필드는 통계와 데이터입니다.
   +  **통계**는 데이터의 형태 및 기타 속성에 대한 정보입니다. 한 번에 하나 이상의 통계를 선택하거나 **모든 통계**를 선택할 수 있습니다. 통계에는 완전성, 고유성, 평균, 합계, 표준편차, 엔트로피, 개별 값 수, 고유값 비율 등이 포함됩니다. 자세한 내용은 [분석기](dqdl.md#dqdl-analyzers) 설명서를 참조하세요.
   +  **데이터**는 데이터 세트의 열입니다. 모든 열 또는 개별 열을 선택할 수 있습니다.  
![\[통계 및 데이터 필드를 보여주는 스크린샷. 데이터 세트에 적용할 통계와 열을 선택할 수 있습니다.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/data-quality-add-analyzer.png)

1.  **이상 탐지 범위 추가**를 선택하여 변경 사항을 저장합니다. 분석기를 추가하고 나면 **이상 탐지 범위** 섹션에서 해당 분석기를 확인할 수 있습니다.

    **작업** 메뉴를 사용하여 분석기를 편집하거나 **규칙 세트 편집기** 탭을 선택하고 규칙 세트 편집기 메모장에서 직접 분석기를 편집할 수도 있습니다. 생성한 규칙 바로 아래에 저장한 분석기가 표시됩니다.

   ```
   Rules = [
   
   ]
   
   Analyzers = [
       Completeness “id”
   ]
   ```

 업데이트된 규칙 세트와 분석기가 구성되면 AWS Glue Data Quality가 들어오는 데이터 스트림을 지속적으로 모니터링합니다. 설정에 따라 알림 또는 작업 중지를 통해 잠재적 이상을 알릴 수 있습니다. 이러한 사전 예방적 모니터링은 데이터 파이프라인 전반에서 데이터 품질과 무결성을 보장하는 데 도움이 됩니다.

 다음 섹션에서는 시스템에서 식별되는 이상을 효과적으로 모니터링하는 방법을 알아봅니다. AWS Glue Data Quality에서 수집한 데이터 통계를 보고 분석하는 방법도 알아봅니다. 아울러 이상 탐지 기능을 지원하는 기계 학습 모델에 피드백을 제공하는 방법도 이해하게 됩니다. 이 피드백 루프는 모델의 정확도를 높이고 특정 비즈니스 요구 사항 및 데이터 패턴에 부합하는 이상을 효과적으로 탐지할 수 있도록 하는 데 매우 중요합니다.

# 데이터 품질 점수 및 이상 보기
<a name="data-quality-viewing-scores-and-anomalies"></a>

 이 섹션에서는 데이터 품질 대시보드와 이 대시보드에서 제공하는 다양한 기능을 살펴보겠습니다.

## 높은 수준의 데이터 품질 지표와 추세를 시각화하고 이해합니다.
<a name="data-quality-visualize-metrics-and-trends"></a>

 작업이 성공하면 **데이터 품질** 탭을 선택하여 데이터 품질 점수와 이상을 확인하세요.

![\[스크린샷은 선택한 데이터 품질 탭과 점수 및 지표를 보여줍니다.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/data-quality-visualize-data-quality-metrics.png)


 데이터 품질 탭의 다음 구성 요소에서는 유용한 정보를 확인할 수 있습니다.

1.  **데이터 품질** 지표를 보려면 데이터 품질 탭을 선택합니다.

1.  데이터 품질 점수를 보려면 특정 작업 실행 ID를 선택합니다.

1.  이 창에는 세 가지 중요한 정보가 표시됩니다. 각각을 선택하여 특정 테이블로 이동하면 이상, 데이터 통계 또는 규칙을 볼 수 있습니다.
   +  규칙 구성 시 데이터 품질 점수 
   +  규칙 및 분석기에서 수집한 통계 수 
   +  탐지된 총 이상 수 

1.  이 추세 차트는 시간 경과에 따른 데이터 품질 추세를 보여줍니다. 추세를 마우스로 가리키면 데이터 품질 점수가 하락한 특정 시점으로 이동할 수 있습니다.

1.  시간 경과에 따른 이상 추세는 시간 경과에 따라 탐지된 이상의 수를 보여줍니다.

1.  탭: 
   +  규칙 탭은 모든 규칙 및 상태 목록을 보여주는 기본 탭입니다. 평가된 규칙은 동적 규칙의 경우 규칙을 평가한 실제 결과 값을 보는 데 유용합니다.
   +  통계 탭에는 모든 통계가 나열되므로 시간 경과에 따른 지표와 추세를 볼 수 있습니다.
   +  이상 탭에는 탐지된 이상 목록이 표시됩니다.

## 이상 보기 및 이상 탐지 알고리즘 훈련
<a name="data-quality-visualize-anomalies"></a>

![\[이 스크린샷은 지표가 있는 이상 탭을 보여줍니다.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/data-quality-visualize-anomaly-detection.png)


 위의 이미지에 대한 콜아웃: 

1.  이상이 탐지되면 이상을 클릭하거나 이상 탭을 선택합니다.

1.  AWS Glue Data Quality가 이상, 실제 값, 예측 범위에 대한 자세한 설명을 제공합니다.

1.  AWS Glue Data Quality이 추세선을 보여줍니다. 여기에는 실제 값, 실제 값을 기반으로 도출된 추세(빨간색 선), 상한 및 하한이 있습니다.

1.  AWS Glue Data Quality가 미래의 패턴을 캡처하는 데 사용할 수 있는 데이터 품질 규칙을 추천합니다. 권장되는 모든 규칙을 복사하고 데이터 품질 노드에 적용하여 이러한 패턴을 효과적으로 캡처할 수 있습니다.

1.  기계 학습(ML) 모델에 입력을 제공하여 이상 값을 제외함으로써 향후 실행에서 이상을 정확하게 탐지하도록 할 수 있습니다. 이상을 명시적으로 제외하지 않으면 AWS Glue Data Quality가 자동으로 향후 예측 시에 이를 모델의 일부로 간주합니다. 입력한 모델 입력은 최신 실행에만 반영된다는 점에 유의해야 합니다. 예를 들어 이전 실행으로 돌아가서 몇 번의 실행에서 이상 포인트를 제외한 경우, 최근 실행에서 모델 입력을 확인하고 업데이트하지 않는 한 모델에 해당 변경 사항이 반영되지 않습니다. 가장 최근 실행에서 필요한 조정을 할 때까지 모델은 이전에 제공된 입력을 계속 사용합니다. 이상 값 제외를 적극적으로 관리하면 특정 데이터 패턴 및 요구 사항의 이상을 구성하는 요소에 대한 ML 모델의 이해도를 높여, 시간이 지남에 따라 이상을 더 정확하게 탐지하도록 할 수 있습니다.

## 시간 경과에 따른 데이터 통계 보기 및 훈련 입력 제공
<a name="data-quality-visualize-data-statistics-over-time"></a>

 데이터 통계 또는 데이터 프로필을 보고 시간 경과에 따라 어떻게 변화하는지 확인해야 할 경우도 있습니다. 이렇게 하려면 **통계**를 선택하거나 **통계** 탭을 엽니다. 그러면 AWS Glue Data Quality에서 수집한 최신 데이터 통계를 볼 수 있습니다.

![\[이 스크린샷은 데이터 세트 및 열 통계가 포함된 통계 탭을 보여줍니다.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/data-quality-visualize-data-statistics-over-time.png)


 **추세 보기**를 클릭하면 시간 경과에 따른 각 통계의 변화를 확인할 수 있습니다.

![\[이 스크린샷은 데이터 세트 및 열 통계가 포함된 통계 탭을 보여줍니다.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/data-quality-view-trends-over-time.png)


1.  특정 열의 통계를 선택할 수 있습니다.

1.  추세가 어떻게 변화하는지 확인할 수 있습니다.

1.  이상 값을 선택하고 제외하거나 포함하도록 선택할 수 있습니다. 이 피드백을 제공하면 알고리즘이 식별된 이상 데이터 포인트를 제외하거나 포함시키고 모델을 재훈련합니다. 사용자가 제공한 피드백을 통해 어떤 값을 이상으로 간주해야 하는지 아닌지를 모델이 학습하므로, 이 재훈련 프로세스를 거치면서 이상을 정확하게 탐지할 수 있게 됩니다.

    이 피드백 루프를 통해 특정 데이터 패턴 및 비즈니스 요구 사항에 맞는 이상을 구성하는 요소에 대한 알고리즘의 이해도를 높일 수 있습니다. 이상으로 표시해서는 안 되는 값을 제외하거나 누락된 값을 포함함으로써 재훈련된 모델은 예상 데이터 포인트와 실제 이상 데이터 포인트를 더 잘 구분하게 됩니다.

# AWS Glue Studio 노트북에서 ETL 작업에 대한 데이터 품질
<a name="data-quality-gs-studio-notebooks"></a>

이 자습서에서는 AWS Glue Studio 노트북에서 추출, 전환, 적재(ETL) 작업에 대해 AWS Glue Data Quality를 사용하는 방법을 알아봅니다.

AWS Glue Studio에서 노트북을 사용하여 전체 작업을 실행하지 않고도 작업 스크립트를 편집하고 출력을 볼 수 있습니다. 마크다운을 추가하고 노트북을 `.ipynb` 파일 및 작업 스크립트로 저장할 수도 있습니다. 소프트웨어를 로컬로 설치하거나 서버를 관리하지 않고도 노트북을 시작할 수 있습니다. 코드가 만족스러우면 AWS Glue Studio를 사용하여 노트북을 AWS Glue 작업으로 쉽게 전환할 수 있습니다.

이 예제에서 사용된 데이터 세트는 두 *Data.CMS.gov* 데이터 세트('Inpatient Prospective Payment System Provider Summary for the Top 100 Diagnosis-Related Groups - FY2011' 및 'Inpatient Charge Data FY 2011')에서 다운로드한 Medicare Provider 지불 데이터로 구성됩니다.

데이터 다운로드 후 데이터 집합을 수정하여 파일 끝에 몇 가지 잘못된 기록을 소개합니다. 이 수정된 파일은 `s3://awsglue-datasets/examples/medicare/Medicare_Hospital_Provider.csv`의 퍼블릭 Amazon S3 버킷에 있습니다.

## 사전 조건
<a name="w2aac49c54c14"></a>
+  대상 Amazon S3 버킷에 대한 Amazon S3 쓰기 권한이 있는 AWS Glue 역할 
+  새 노트북([AWS Glue Studio에서 노트북 시작하기](https://docs.aws.amazon.com/glue/latest/ug/notebook-getting-started.html) 참조) 

## AWS Glue Studio에서 ETL 작업 생성
<a name="data-quality-notebooks-example"></a>

**ETL 작업을 생성하려면**

1.  세션 버전을 AWS Glue 3.0으로 변경합니다.

    이렇게 하려면 다음과 같은 매직으로 모든 표준 문안 코드 셀을 제거하고 셀을 실행합니다. 이 표준 문안 코드는 새 노트북이 생성되면 첫 번째 셀에 자동으로 제공됩니다.

   ```
   %glue_version 3.0
   ```

1.  다음 코드를 복사하여 셀에서 실행합니다.

   ```
   import sys
   from awsglue.transforms import *
   from awsglue.utils import getResolvedOptions
   from pyspark.context import SparkContext
   from awsglue.context import GlueContext
   from awsglue.job import Job
   
   sc = SparkContext.getOrCreate()
   glueContext = GlueContext(sc)
   spark = glueContext.spark_session
   job = Job(glueContext)
   ```

1.  다음 셀에서는 AWS Glue Data Quality를 평가하는 `EvaluateDataQuality` 클래스를 가져옵니다.

   ```
   from awsgluedq.transforms import EvaluateDataQuality
   ```

1. 다음 셀에서는 퍼블릭 Amazon S3 버킷에 저장된.csv 파일을 사용하여 소스 데이터를 읽습니다.

   ```
   medicare = spark.read.format(
   "csv").option(
   "header", "true").option(
   "inferSchema", "true").load(
   's3://awsglue-datasets/examples/medicare/Medicare_Hospital_Provider.csv')
   medicare.printSchema()
   ```

1.  데이터를 AWS Glue DynamicFrame으로 변환합니다.

   ```
   from awsglue.dynamicframe import DynamicFrame
   medicare_dyf = DynamicFrame.fromDF(medicare,glueContext,"medicare_dyf")
   ```

1.  데이터 품질 정의 언어(DQDL)를 사용하여 규칙 세트를 생성합니다.

   ```
   EvaluateDataQuality_ruleset = """
       Rules = [
           ColumnExists "Provider Id",
           IsComplete "Provider Id",
           ColumnValues  " Total Discharges " > 15
   ]
       ]
   """
   ```

1.  규칙 세트를 기준으로 데이터 세트를 검증합니다.

   ```
   EvaluateDataQualityMultiframe = EvaluateDataQuality().process_rows(
       frame=medicare_dyf,
       ruleset=EvaluateDataQuality_ruleset,
       publishing_options={
           "dataQualityEvaluationContext": "EvaluateDataQualityMultiframe",
           "enableDataQualityCloudWatchMetrics": False,
           "enableDataQualityResultsPublishing": False,
       },
       additional_options={"performanceTuning.caching": "CACHE_NOTHING"},
   )
   ```

1.  결과를 검토합니다.

   ```
   ruleOutcomes = SelectFromCollection.apply(
       dfc=EvaluateDataQualityMultiframe,
       key="ruleOutcomes",
       transformation_ctx="ruleOutcomes",
   )
   
   ruleOutcomes.toDF().show(truncate=False)
   ```

    출력: 

   ```
   --------------------------------------+-------+-----------------------------------------------------+-------------------------------------------+
   |Rule                                  |Outcome|FailureReason                                        |EvaluatedMetrics                           |
   +--------------------------------------+-------+-----------------------------------------------------+-------------------------------------------+
   |ColumnExists "Provider Id"            |Passed |null                                                 |{}                                         |
   |IsComplete "Provider Id"              |Passed |null                                                 |{Column.Provider Id.Completeness -> 1.0}   |
   |ColumnValues " Total Discharges " > 15|Failed |Value: 11.0 does not meet the constraint requirement!|{Column. Total Discharges .Minimum -> 11.0}|
   +--------------------------------------+-------+-----------------------------------------------------+-------------------------------------------+
   ```

1.  Data Quality 행 수준 결과에서 통과된 행을 필터링하고 실패한 행을 검토합니다.

   ```
   owLevelOutcomes = SelectFromCollection.apply(
   dfc=EvaluateDataQualityMultiframe,
   key="rowLevelOutcomes",
   transformation_ctx="rowLevelOutcomes",
   )
   
   rowLevelOutcomes_df = rowLevelOutcomes.toDF() # Convert Glue DynamicFrame to SparkSQL DataFrame
   rowLevelOutcomes_df_passed = rowLevelOutcomes_df.filter(rowLevelOutcomes_df.DataQualityEvaluationResult == "Passed") # Filter only the Passed records.
   rowLevelOutcomes_df.filter(rowLevelOutcomes_df.DataQualityEvaluationResult == "Failed").show(5, truncate=False) # Review the Failed records
   ```

    출력: 

   ```
   +----------------------------------------+-----------+-------------------------------------+--------------------------+-------------+--------------+-----------------+------------------------------------+------------------+-------------------------+------------------------+-------------------------+--------------------------+----------------------------------------+----------------------------+---------------------------+
   |DRG Definition                          |Provider Id|Provider Name                        |Provider Street Address   |Provider City|Provider State|Provider Zip Code|Hospital Referral Region Description| Total Discharges | Average Covered Charges | Average Total Payments |Average Medicare Payments|DataQualityRulesPass      |DataQualityRulesFail                    |DataQualityRulesSkip        |DataQualityEvaluationResult|
   +----------------------------------------+-----------+-------------------------------------+--------------------------+-------------+--------------+-----------------+------------------------------------+------------------+-------------------------+------------------------+-------------------------+--------------------------+----------------------------------------+----------------------------+---------------------------+
   |039 - EXTRACRANIAL PROCEDURES W/O CC/MCC|10005      |MARSHALL MEDICAL CENTER SOUTH        |2505 U S HIGHWAY 431 NORTH|BOAZ         |AL            |35957            |AL - Birmingham                     |14                |$15131.85                |$5787.57                |$4976.71                 |[IsComplete "Provider Id"]|[ColumnValues " Total Discharges " > 15]|[ColumnExists "Provider Id"]|Failed                     |
   |039 - EXTRACRANIAL PROCEDURES W/O CC/MCC|10046      |RIVERVIEW REGIONAL MEDICAL CENTER    |600 SOUTH THIRD STREET    |GADSDEN      |AL            |35901            |AL - Birmingham                     |14                |$67327.92                |$5461.57                |$4493.57                 |[IsComplete "Provider Id"]|[ColumnValues " Total Discharges " > 15]|[ColumnExists "Provider Id"]|Failed                     |
   |039 - EXTRACRANIAL PROCEDURES W/O CC/MCC|10083      |SOUTH BALDWIN REGIONAL MEDICAL CENTER|1613 NORTH MCKENZIE STREET|FOLEY        |AL            |36535            |AL - Mobile                         |15                |$25411.33                |$5282.93                |$4383.73                 |[IsComplete "Provider Id"]|[ColumnValues " Total Discharges " > 15]|[ColumnExists "Provider Id"]|Failed                     |
   |039 - EXTRACRANIAL PROCEDURES W/O CC/MCC|30002      |BANNER GOOD SAMARITAN MEDICAL CENTER |1111 EAST MCDOWELL ROAD   |PHOENIX      |AZ            |85006            |AZ - Phoenix                        |11                |$34803.81                |$7768.90                |$6951.45                 |[IsComplete "Provider Id"]|[ColumnValues " Total Discharges " > 15]|[ColumnExists "Provider Id"]|Failed                     |
   |039 - EXTRACRANIAL PROCEDURES W/O CC/MCC|30010      |CARONDELET ST  MARYS HOSPITAL        |1601 WEST ST MARY'S ROAD  |TUCSON       |AZ            |85745            |AZ - Tucson                         |12                |$35968.50                |$6506.50                |$5379.83                 |[IsComplete "Provider Id"]|[ColumnValues " Total Discharges " > 15]|[ColumnExists "Provider Id"]|Failed                     |
   +----------------------------------------+-----------+-------------------------------------+--------------------------+-------------+--------------+-----------------+------------------------------------+------------------+-------------------------+------------------------+-------------------------+--------------------------+----------------------------------------+----------------------------+---------------------------+
   only showing top 5 rows
   ```

    AWS Glue Data Quality에서는 새 열 네 개(DataQualityRulesPass, DataQualityRulesFail, DataQualityRulesSkip, DataQualityEvaluationResult)를 추가했습니다. 이는 통과한 레코드, 실패한 레코드, 행 수준 평가에서 건너뛴 규칙, 전체 행 수준 결과를 나타냅니다.

1.  출력을 Amazon S3 버킷에 기록하여 데이터를 분석하고 결과를 시각화합니다.

   ```
   #Write the Passed records to the destination. 
   
   glueContext.write_dynamic_frame.from_options(
          frame = rowLevelOutcomes_df_passed,
          connection_type = "s3",
          connection_options = {"path": "s3://glue-sample-target/output-dir/medicare_parquet"},
          format = "parquet")
   ```

# 데이터 품질 정의 언어(DQDL) 참조
<a name="dqdl"></a>

DQDL(데이터 품질 정의 언어)은 AWS Glue 데이터 품질에 대한 규칙을 정의하는 데 사용되는 도메인별 언어입니다.

이 안내서에서는 언어를 이해하는 데 도움이 되는 주요 DQDL 개념을 소개합니다. 또한 구문 및 예제와 함께 DQDL 규칙 유형에 대한 참조를 제공합니다. 이 안내서를 사용하기 전에 AWS Glue 데이터 품질을 숙지하는 것이 좋습니다. 자세한 내용은 [AWS Glue Data Quality](glue-data-quality.md) 섹션을 참조하세요.

**참고**  
 DynamicRule은 AWS Glue ETL에서만 지원됩니다.

**Contents**
+ [DQDL 구문](#dqdl-syntax)
  + [규칙 구조](#dqdl-syntax-rule-structure)
  + [복합 규칙](#dqdl-syntax-rule-composition)
    + [복합 규칙의 작동 방식](#dqdl-syntax-composite-rules)
  + [Expressions](#dqdl-syntax-rule-expressions)
    + [NULL, EMPTY, WHITESPACES\$1ONLY에 대한 키워드](#dqdl-keywords-null-empty-whitespaces_only)
    + [Where 절을 사용한 필터링](#dqdl-filtering-data-in-dqdl)
  + [상수](#dqdl-constants)
  + [레이블](#dqdl-labels)
    + [DQDL 레이블 구문](#dqdl-labels-syntax)
      + [레이블 제약 조건](#dqdl-labels-constraints)
    + [DQDL 레이블 검색](#dqdl-labels-retrieving)
      + [규칙 결과](#dqdl-labels-rule-outcomes)
      + [행 수준 결과](#dqdl-labels-row-level-results)
      + [API 응답](#dqdl-labels-api-response)
  + [동적 규칙](#dqdl-dynamic-rules)
  + [분석기](#dqdl-analyzers)
  + [설명](#dqdl-syntax-comments)
+ [DQDL 규칙 유형 참조](dqdl-rule-types.md)
  + [AggregateMatch](dqdl-rule-types-AggregateMatch.md)
  + [ColumnCorrelation](dqdl-rule-types-ColumnCorrelation.md)
  + [ColumnCount](dqdl-rule-types-ColumnCount.md)
  + [ColumnDataType](dqdl-rule-types-ColumnDataType.md)
  + [ColumnExists](dqdl-rule-types-ColumnExists.md)
  + [ColumnLength](dqdl-rule-types-ColumnLength.md)
  + [ColumnNamesMatchPattern](dqdl-rule-types-ColumnNamesMatchPattern.md)
  + [ColumnValues](dqdl-rule-types-ColumnValues.md)
  + [완전성](dqdl-rule-types-Completeness.md)
  + [CustomSQL](dqdl-rule-types-CustomSql.md)
  + [DataFreshness](dqdl-rule-types-DataFreshness.md)
  + [DatasetMatch](dqdl-rule-types-DatasetMatch.md)
  + [DistinctValuesCount](dqdl-rule-types-DistinctValuesCount.md)
  + [Entropy](dqdl-rule-types-Entropy.md)
  + [IsComplete](dqdl-rule-types-IsComplete.md)
  + [IsPrimaryKey](dqdl-rule-types-IsPrimaryKey.md)
  + [IsUnique](dqdl-rule-types-IsUnique.md)
  + [Mean](dqdl-rule-types-Mean.md)
  + [ReferentialIntegrity](dqdl-rule-types-ReferentialIntegrity.md)
  + [RowCount](dqdl-rule-types-RowCount.md)
  + [RowCountMatch](dqdl-rule-types-RowCountMatch.md)
  + [StandardDeviation](dqdl-rule-types-StandardDeviation.md)
  + [Sum](dqdl-rule-types-Sum.md)
  + [SchemaMatch](dqdl-rule-types-SchemaMatch.md)
  + [Uniqueness](dqdl-rule-types-Uniqueness.md)
  + [UniqueValueRatio](dqdl-rule-types-UniqueValueRatio.md)
  + [DetectAnomalies](dqdl-rule-types-DetectAnomalies.md)
  + [FileFreshness](dqdl-rule-types-FileFreshness.md)
  + [FileMatch](dqdl-rule-types-FileMatch.md)
  + [FileUniqueness](dqdl-rule-types-FileUniqueness.md)
  + [FileSize](dqdl-rule-types-FileSize.md)

## DQDL 구문
<a name="dqdl-syntax"></a>

DQDL 문서는 대/소문자를 구분하며 개별 데이터 품질 규칙을 그룹화하는 **규칙 세트를 포함합니다. 규칙 세트를 구성하려면 한 쌍의 대괄호로 구분된 `Rules`(대문자) 목록을 생성해야 합니다. 목록에는 다음 예와 같이 쉼표로 구분된 DQDL 규칙이 하나 이상 포함되어야 합니다.

```
Rules = [
   IsComplete "order-id",
   IsUnique "order-id"
]
```

### 규칙 구조
<a name="dqdl-syntax-rule-structure"></a>

DQDL 규칙의 구조는 규칙 유형에 따라 달라집니다. 하지만 DQDL 규칙은 일반적으로 다음 형식에 적합합니다.

```
<RuleType> <Parameter> <Parameter> <Expression>
```

`RuleType`은 구성하려는 규칙 유형의 이름(대/소문자 구분)입니다. 예: `IsComplete`, `IsUnique` 또는 `CustomSql`. 규칙 파라미터는 규칙 유형마다 다릅니다. DQDL 규칙 유형 및 파라미터에 대한 전체 참조는 [DQDL 규칙 유형 참조](dqdl-rule-types.md) 섹션을 참조하세요.

### 복합 규칙
<a name="dqdl-syntax-rule-composition"></a>

 DQDL은 규칙을 결합하는 데 사용될 수 있는 다음과 같은 논리 연산자를 지원합니다. 이러한 규칙을 복합 규칙이라고 합니다.

**및**  
논리 `and` 연산자는 연결하는 규칙이 `true`인 경우에만 `true` 결과를 얻습니다. 그렇지 않으면 결합된 규칙에 따라 `false` 결과를 얻습니다. `and` 연산자와 연결하는 각 규칙은 괄호로 묶어야 합니다.  
다음 예제에서는 `and` 연산자를 사용하여 두 DQDL 규칙을 결합합니다.  

```
(IsComplete "id") and (IsUnique "id")
```

**또는**  
논리 `or` 연산자는 연결하는 규칙 중 하나 이상이 `true`인 경우에만 `true` 결과를 얻습니다. `or` 연산자와 연결하는 각 규칙은 괄호로 묶어야 합니다.  
다음 예제에서는 `or` 연산자를 사용하여 두 DQDL 규칙을 결합합니다.  

```
(RowCount "id" > 100) or (IsPrimaryKey "id")
```

동일한 연산자를 사용하여 여러 규칙을 연결할 수 있으므로 다음과 같은 규칙 조합이 허용됩니다.

```
(Mean "Star_Rating" > 3) and (Mean "Order_Total" > 500) and (IsComplete "Order_Id")
```

논리 연산자를 단일 표현식으로 결합할 수 없습니다. 예제:

```
(Mean "Star_Rating" > 3) and ((Mean "Order_Total" > 500) or (IsComplete "Order_Id"))
```

더 복잡하고 중첩된 규칙을 작성할 수도 있습니다.

```
(RowCount > 0) or ((IsComplete "colA") and (IsUnique "colA"))
```

#### 복합 규칙의 작동 방식
<a name="dqdl-syntax-composite-rules"></a>

 기본적으로 복합 규칙은 전체 데이터세트 또는 테이블에서 개별 규칙으로 평가된 다음 결과가 결합됩니다. 즉, 전체 열을 먼저 평가한 다음 연산자를 적용합니다. 이 기본 동작은 예제와 함께 아래에 설명되어 있습니다.

```
# Dataset

+------+------+
|myCol1|myCol2|
+------+------+
|     2|     1|
|     0|     3|
+------+------+

# Overall outcome

+----------------------------------------------------------+-------+
|Rule                                                      |Outcome|
+----------------------------------------------------------+-------+
|(ColumnValues "myCol1" > 1) OR (ColumnValues "myCol2" > 2)|Failed |
+----------------------------------------------------------+-------+
```

 위의 예제에서 AWS Glue Data Quality는 먼저 `(ColumnValues "myCol1" > 1)`을 평가하여 실패하게 됩니다. 그런 다음 `(ColumnValues "myCol2" > 2)`를 평가하며 역시 실패하게 됩니다. 두 결과의 조합은 FAILED로 표시됩니다.

 그러나 전체 행을 평가해야 하는 SQL과 같은 동작을 선호하는 경우 아래 코드 스니펫의 `additionalOptions`에 표시된 것처럼 `ruleEvaluation.scope` 파라미터를 명시적으로 설정해야 합니다.

```
object GlueApp {
  val datasource = glueContext.getCatalogSource(
    database="<db>",
    tableName="<table>",
    transformationContext="datasource"
  ).getDynamicFrame()

  val ruleset = """
    Rules = [
        (ColumnValues "age" >= 26) OR (ColumnLength "name" >= 4)        
    ]
  """

  val dq_results = EvaluateDataQuality.processRows(
    frame=datasource,
    ruleset=ruleset,
    additionalOptions=JsonOptions("""
        {
          "compositeRuleEvaluation.method":"ROW"
        }
      """
    )
  )
}
```

 AWS Glue Data Catalog에서는 아래와 같이 사용자 인터페이스에서 이 옵션을 쉽게 구성할 수 있습니다.

![\[이 스크린샷은 행과 열 사이에서 규칙 평가 구성을 선택할 수 있는 복합 규칙 설정 창을 보여줍니다. 행을 선택하면 복합 규칙은 전체 행을 평가하는 단일 규칙으로 작동합니다. 열을 선택하면 복합 규칙은 전체 데이터 세트에서 개별 규칙을 평가하고 결과를 결합합니다.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/composite-rule-settings.png)


 일단 설정되면 복합 규칙은 전체 행을 평가하는 단일 규칙으로 작동합니다. 다음 예제는 이 동작을 보여 줍니다.

```
# Row Level outcome

+------+------+------------------------------------------------------------+---------------------------+
|myCol1|myCol2|DataQualityRulesPass                                        |DataQualityEvaluationResult|
+------+------+------------------------------------------------------------+---------------------------+
|2     |1     |[(ColumnValues "myCol1" > 1) OR (ColumnValues "myCol2" > 2)]|Passed                     |
|0     |3     |[(ColumnValues "myCol1" > 1) OR (ColumnValues "myCol2" > 2)]|Passed                     |
+------+------+------------------------------------------------------------+---------------------------+
```

 일부 규칙은 임계값이나 비율에 따라 전체 결과가 달라지므로 이 기능에서 지원되지 않습니다. 이는 아래에 나열되어 있습니다.

 비율에 따른 규칙: 
+  완전성 
+  DatasetMatch 
+  ReferentialIntegrity 
+  Uniqueness 

 임계값에 따른 규칙: 

 다음 규칙에 with threshold가 포함된 경우 해당 규칙은 지원되지 않습니다. 그러나 `with threshold`를 포함하지 않는 규칙은 계속 지원됩니다.
+  ColumnDataType 
+  ColumnValues 
+  CustomSQL 

### Expressions
<a name="dqdl-syntax-rule-expressions"></a>

규칙 유형이 부울 응답을 생성하지 않는 경우 부울 응답을 생성하려면 표현식을 파라미터로 제공해야 합니다. 예를 들어 다음 규칙은 열에 있는 모든 값의 중앙값(평균)을 표현식과 비교하여 true 또는 false 결과를 반환합니다.

```
Mean "colA" between 80 and 100
```

`IsUnique` 및 `IsComplete`와 같은 일부 규칙 유형은 이미 부울 응답을 반환합니다.

다음 표는 DQDL 규칙에서 사용할 수 있는 표현식을 나열합니다.


**지원되는 DQDL 표현식**  

| 표현식 | 설명 | 예제 | 
| --- | --- | --- | 
| =x | 규칙 유형 응답이 x와 같은 경우 true로 확인됩니다. |  <pre>Completeness "colA" = "1.0",<br />ColumnValues "colA" = "2022-06-30"</pre>  | 
|  \$1=x  | 규칙 유형 응답이 x와 같지 않으면 x는 true로 확인됩니다. |  <pre>ColumnValues "colA" != "a",<br />ColumnValues "colA" != "2022-06-30"</pre>  | 
| > x | 규칙 유형 응답이 x보다 큰 경우 true로 확인됩니다. |  <pre>ColumnValues "colA" > 10</pre>  | 
| < x | 규칙 유형 응답이 x보다 작은 경우 true로 확인됩니다. |  <pre>ColumnValues "colA" < 1000,<br />ColumnValues "colA" < "2022-06-30"</pre>  | 
| >= x | 규칙 유형 응답이 x보다 크거나 같은 경우 true로 확인됩니다. |  <pre>ColumnValues "colA" >= 10</pre>  | 
| <= x | 규칙 유형 응답이 x보다 작거나 같은 경우 true로 확인됩니다. |  <pre>ColumnValues "colA" <= 1000</pre>  | 
| between x and y | 규칙 유형 응답이 지정된 범위(제외)에 속하는 경우 true로 확인됩니다. 이 표현식 유형은 숫자 및 날짜 유형에만 사용해야 합니다. |  <pre>Mean "colA" between 8 and 100,<br />ColumnValues "colA" between "2022-05-31" and "2022-06-30"</pre>  | 
|  x 및 y 사이가 아님  |  규칙 유형 응답이 지정된 범위(포함)에 속하지 않으면 true로 확인됩니다. 이 표현식 유형은 숫자 및 날짜 유형에만 사용해야 합니다. |  <pre>ColumnValues "colA" not between "2022-05-31" and "2022-06-30"</pre>  | 
| in [a, b, c, ...] | 규칙 유형 응답이 지정된 세트 내에 있는 경우 true로 확인됩니다. |  <pre>ColumnValues "colA" in [ 1, 2, 3 ],<br />ColumnValues "colA" in [ "a", "b", "c" ]</pre>  | 
| not in [a, b, c, ...] | 규칙 유형 응답이 지정된 세트에 없으면 true로 확인됩니다. |  <pre>ColumnValues "colA" not in [ 1, 2, 3 ],<br />ColumnValues "colA" not in [ "a", "b", "c" ]</pre>  | 
| matches /ab\$1c/i | 규칙 유형 응답이 정규 표현식과 일치하는 경우 true로 확인됩니다. |  <pre>ColumnValues "colA" matches "[a-zA-Z]*"</pre>  | 
| /ab\$1c/i와 일치하지 않음 | 규칙 유형 응답이 정규식과 일치하지 않는 경우 true로 확인됩니다. |  <pre>ColumnValues "colA" not matches "[a-zA-Z]*"</pre>  | 
| now() | ColumnValues 규칙 유형에서만 작동하여 날짜 표현식을 생성합니다. |  <pre>ColumnValues "load_date" > (now() - 3 days)</pre>  | 
| matches/in […]/not matches/not in [...] with threshold | 규칙 조건과 일치하는 값의 백분율을 지정합니다. ColumnValues, ColumnDataType, CustomSQL 규칙 유형에만 적용됩니다. |  <pre>ColumnValues "colA" in ["A", "B"] with threshold > 0.8,<br />ColumnValues "colA" matches "[a-zA-Z]*" with threshold between 0.2 and 0.9<br />ColumnDataType "colA" = "Timestamp" with threshold > 0.9</pre>  | 

#### NULL, EMPTY, WHITESPACES\$1ONLY에 대한 키워드
<a name="dqdl-keywords-null-empty-whitespaces_only"></a>

 문자열 열에 null, 비어 있음 또는 공백만 있는 문자열이 있는지 확인하려면 다음 키워드를 사용할 수 있습니다.
+  NULL/null - 이 키워드는 문자열 열의 `null` 값에 대해 true로 확인됩니다.

   `ColumnValues "colA" != NULL with threshold > 0.5`는 데이터의 50% 이상에 null 값이 없는 경우 true를 반환합니다.

   `(ColumnValues "colA" = NULL) or (ColumnLength "colA" > 5)`는 null 값이 있거나 길이가 5를 초과하는 모든 행에 대해 true를 반환합니다. **이 경우 "compositeRuleEvaluation.method" = "ROW" 옵션을 사용해야 한다는 점에 유의하세요.
+  EMPTY/empty - 이 키워드는 문자열 열의 빈 문자열("") 값에 대해 true로 확인됩니다. 일부 데이터 형식은 문자열 열의 null을 빈 문자열로 변환합니다. 이 키워드는 데이터에서 빈 문자열을 필터링하는 데 도움이 됩니다.

   `(ColumnValues "colA" = EMPTY) or (ColumnValues "colA" in ["a", "b"])`는 행이 비어 있거나 "a" 또는 "b"인 경우 true를 반환합니다. **이 경우 "compositeRuleEvaluation.method" = "ROW" 옵션을 사용해야 한다는 점에 유의하세요.
+  WHITESPACES\$1ONLY/whitespaces\$1only - 이 키워드는 문자열 열에 공백(" ") 값만 있는 문자열에 대해 true로 확인됩니다.

   `ColumnValues "colA" not in ["a", "b", WHITESPACES_ONLY]`는 ‘a’, ‘b’ 또는 공백만 있는 행이 아닌 경우 true를 반환합니다.

   지원되는 규칙: 
  +  [ColumnValues](https://docs.aws.amazon.com/glue/latest/dg/dqdl.html#dqdl-rule-types-ColumnValues) 

 숫자 또는 날짜 기반 표현식에서 열에 null이 있는지 확인하려는 경우 다음 키워드를 사용할 수 있습니다.
+  NULL/null - 이 키워드는 문자열 열의 null 값에 대해 true로 확인됩니다.

   `ColumnValues "colA" in [NULL, "2023-01-01"]`은 열의 날짜가 `2023-01-01`이거나 null인 경우 true를 반환합니다.

   `(ColumnValues "colA" = NULL) or (ColumnValues "colA" between 1 and 9)`는 null 값이 있거나 1에서 9 사이의 값을 갖는 모든 행에 대해 true를 반환합니다. **이 경우 "compositeRuleEvaluation.method" = "ROW" 옵션을 사용해야 한다는 점에 유의하세요.

   지원되는 규칙: 
  +  [ColumnValues](https://docs.aws.amazon.com/glue/latest/dg/dqdl.html#dqdl-rule-types-ColumnValues) 

#### Where 절을 사용한 필터링
<a name="dqdl-filtering-data-in-dqdl"></a>

**참고**  
 여기에서 조항은 AWS Glue 4.0에서만 지원됩니다.

 규칙을 작성할 때 데이터를 필터링할 수 있습니다. 이는 조건부 규칙을 적용하려는 경우에 유용합니다.

```
<DQDL Rule> where "<valid SparkSQL where clause> "
```

 필터는 `where` 키워드와 따옴표(`("")`)로 묶인 유효한 SparkSQL 문을 사용하여 지정해야 합니다.

 임계값이 있는 규칙에 where 절을 추가하려면 임계값 조건보다 먼저 where 절을 지정해야 합니다.

```
<DQDL Rule> where "valid SparkSQL statement>" with threshold <threshold condition>
```

 이 구문을 사용하면 다음과 같은 규칙을 작성할 수 있습니다.

```
Completeness "colA" > 0.5 where "colB = 10"
ColumnValues "colB" in ["A", "B"] where "colC is not null" with threshold > 0.9
ColumnLength "colC" > 10 where "colD != Concat(colE, colF)"
```

 제공된 SparkSQL 문이 유효한지 검증해보겠습니다. 유효하지 않은 경우 규칙 평가가 실패하고 다음 형식의 `IllegalArgumentException`이 실행됩니다.

```
Rule <DQDL Rule> where "<invalid SparkSQL>" has provided an invalid where clause :
<SparkSQL Error>
```

 **행 수준 오류 레코드 식별 기능이 켜져 있을 때의 Where 절 동작** 

 AWS Glue Data Quality를 사용하면 실패한 특정 레코드를 식별할 수 있습니다. 행 수준 결과를 지원하는 규칙에 where 절을 적용할 때는 where 절로 필터링된 행에 `Passed`라는 레이블을 지정합니다.

 필터링된 행에 별도로 `SKIPPED`라는 레이블을 지정하려는 경우 ETL 작업에 대해 다음 `additionalOptions`를 설정할 수 있습니다.

```
object GlueApp {
  val datasource = glueContext.getCatalogSource(
    database="<db>",
    tableName="<table>",
    transformationContext="datasource"
  ).getDynamicFrame()

  val ruleset = """
    Rules = [
       IsComplete "att2" where "att1 = 'a'"        
    ]
  """

  val dq_results = EvaluateDataQuality.processRows(
    frame=datasource,
    ruleset=ruleset,
    additionalOptions=JsonOptions("""
        {
          "rowLevelConfiguration.filteredRowLabel":"SKIPPED"
        }
      """
    )
  )
}
```

 다음 규칙 및 데이터 프레임을 예시로 참조하세요.

```
IsComplete att2 where "att1 = 'a'"
```


| id | att1 | att2 | 행 수준 결과(기본값) | 행 수준 결과(Skipped 옵션) | 설명 | 
| --- | --- | --- | --- | --- | --- | 
| 1 | a | f | 통과 | 통과 |  | 
| 2 | b | d | 통과 | SKIPPED | att1이 "a"가 아니므로 행이 필터링됩니다. | 
| 3 | a | null | FAILED | FAILED |  | 
| 4 | a | f | 통과 | 통과 |  | 
| 5 | b | null | 통과 | SKIPPED | att1이 "a"가 아니므로 행이 필터링됩니다. | 
| 6 | a | f | 통과 | 통과 |  | 

### 상수
<a name="dqdl-constants"></a>

 DQDL에서 상수 값을 정의하고 스크립트 전체에서 참조할 수 있습니다. 이는 허용 가능한 경계를 초과할 수 있는 큰 SQL 문으로 작업할 때처럼 쿼리 크기 제한과 관련된 문제를 방지하는 데 도움이 됩니다. 이러한 값을 상수에 할당하면 DQDL을 간소화하고 이러한 제한에 도달하지 않도록 할 수 있습니다.

 다음 예제는 상수를 정의하고 사용하는 방법을 보여줍니다.

```
mySql = "select count(*) from primary"

Rules = [
    CustomSql $mySql between 0 and 100
]
```

 이 예제에서는 SQL 쿼리가 상수 `mySql`에 할당된 다음 이 상수가 `$` 접두사를 사용하여 규칙에서 참조됩니다.

### 레이블
<a name="dqdl-labels"></a>

 레이블은 데이터 품질 결과를 구성하고 분석하는 효과적인 방법을 제공합니다. 특정 레이블로 결과를 쿼리하여 특정 범주 내의 실패한 규칙을 식별하고, 팀 또는 도메인별로 규칙 결과를 계산하고, 다양한 이해관계자를 위한 집중 보고서를 생성할 수 있습니다.

 예를 들어 `"team=finance"` 레이블을 사용하여 재무 팀과 관련된 모든 규칙을 적용하고 재무 팀과 관련된 품질 지표를 보여주는 사용자 지정 보고서를 생성할 수 있습니다. 우선순위가 높은 규칙에 `"criticality=high"` 레이블을 지정하여 문제 해결 작업의 우선순위를 지정할 수 있습니다. 레이블은 DQDL의 일부로 작성할 수 있습니다. 규칙 결과, 행 수준 결과, API 응답의 일부로 레이블을 쿼리할 수 있어, 기존 모니터링 및 보고 워크플로와 쉽게 통합할 수 있습니다.

**참고**  
 레이블은 AWS Glue ETL에서만 사용할 수 있으며 AWS Glue Data Catalog 기반 Data Quality에서는 사용할 수 없습니다.

#### DQDL 레이블 구문
<a name="dqdl-labels-syntax"></a>

 DQDL은 기본 레이블과 규칙별 레이블을 모두 지원합니다. 기본 레이블은 규칙 세트 수준에서 정의되며 해당 규칙 세트 내의 모든 규칙에 자동 적용됩니다. 개별 규칙에는 자체 레이블이 있을 수 있으며, 레이블이 키 값 페어로 구현되므로 동일한 키를 사용할 때 규칙별 레이블이 기본 레이블을 재정의할 수 있습니다.

 다음 예제에서는 기본 레이블과 규칙별 레이블을 사용하는 방법을 보여줍니다.

```
DefaultLabels=["frequency"="monthly"]

Rules = [
    // Auto includes the default label ["frequency"="monthly"]
    ColumnValues "col" > 21,
    // Add ["foo"="bar"] to default label. Labels for this rule would be ["frequency"="monthly", "foo"="bar"]
    Rule 1 with threshold > 0.8 labels=["foo"="bar"],
    // Override default label. Labels for this rule would be ["frequency"="daily", "foo"="bar"]
    Rule 2 with threshold > 0.8 labels=["foo"="bar", "frequency"="daily"]
    // Labels must be applied to the entire composite rule (parentheses required)
    (Rule 1 AND Rule 2) labels=["foo"="bar]
]
```

##### 레이블 제약 조건
<a name="dqdl-labels-constraints"></a>

 레이블의 제약 조건은 
+ DQDL 규칙당 최대 10개의 레이블입니다.
+ 레이블은 키 값 페어 목록으로 지정됩니다.
+ 레이블 키와 레이블 값은 대소문자를 구분합니다.
+ 레이블 키의 최대 길이는 128자입니다. 레이블 키는 비어 있거나 null이면 안 됩니다.
+ 레이블 값의 최대 길이는 256자입니다. 레이블 값은 비어 있거나 null일 수 있습니다.

#### DQDL 레이블 검색
<a name="dqdl-labels-retrieving"></a>

 규칙 결과, 행 수준 결과, API 응답에서 DQDL 레이블을 검색할 수 있습니다.

##### 규칙 결과
<a name="dqdl-labels-rule-outcomes"></a>

 DQDL 레이블은 규칙 결과에 항상 표시됩니다. DQDL 레이블을 활성화하기 위해 필요한 추가 구성은 없습니다.

##### 행 수준 결과
<a name="dqdl-labels-row-level-results"></a>

 DQDL 레이블은 행 수준 결과에서 기본적으로 비활성화되지만 `EvaluateDataQuality`에서 `AdditionalOptions`를 사용하여 활성화할 수 있습니다.

 다음 예제는 행 수준 결과에서 레이블을 활성화하는 방법을 보여줍니다.

```
val evaluateResult = EvaluateDataQuality.processRows(
    frame=AmazonS3_node1754591511068,
    ruleset=example_ruleset,
    publishingOptions=JsonOptions("""{
        "dataQualityEvaluationContext": "evaluateResult",
        "enableDataQualityCloudWatchMetrics": "true",
        "enableDataQualityResultsPublishing": "true"
    }"""),
    additionalOptions=JsonOptions("""{
        "performanceTuning.caching":"CACHE_NOTHING",
        "observations.scope":"ALL",
        "rowLevelConfiguration.ruleWithLabels":"ENABLED"
    }""")
)
```

 활성화되면 행 수준 결과 데이터 프레임에 `DataQualityRulesPass`, `DataQualityRulesFail`, `DataQualityRulesSkip` 열의 각 규칙의 레이블이 포함됩니다.

##### API 응답
<a name="dqdl-labels-api-response"></a>

 DQDL 레이블은 `RuleResults` 객체의 새 필드 `Labels` 아래에 있는 API 응답에 항상 표시됩니다.

 다음 예제는 API 응답의 레이블을 보여줍니다.

```
{
    "ResultId": "dqresult-example",
    "ProfileId": "dqprofile-example",
    "Score": 0.6666666666666666,
    "RulesetName": "EvaluateDataQuality_node1754591514205",
    "EvaluationContext": "EvaluateDataQuality_node1754591514205",
    "StartedOn": "2025-08-22T19:36:10.448000+00:00",
    "CompletedOn": "2025-08-22T19:36:16.368000+00:00",
    "JobName": "anniezc-test-labels",
    "JobRunId": "jr_068f6d7a45074d9105d14e4dee09db12c3b95664b45f6ee44fa29ed7e5619ba8",
    "RuleResults": [
        {
            "Name": "Rule_0",
            "Description": "IsComplete colA",
            "EvaluationMessage": "Input data does not include column colA!",
            "Result": "FAIL",
            "EvaluatedMetrics": {},
            "EvaluatedRule": "IsComplete colA",
            "Labels": {
                "frequency": "monthly"
            }
        },
        {
            "Name": "Rule_1",
            "Description": "Rule 1 with threshold > 0.8",
            "Result": "PASS",
            "EvaluatedMetrics": {},
            "EvaluatedRule": "Rule 1 with threshold > 0.8",
            "Labels": {
                "frequency": "monthly",
                "foo": "bar"
            }
        },
        {
            "Name": "Rule_3",
            "Description": "Rule 2 with threshold > 0.8",
            "Result": "PASS",
            "EvaluatedMetrics": {},
            "EvaluatedRule": "Rule 2 with threshold > 0.8",
            "Labels": {
                "frequency": "daily",
                "foo": "bar"
            }
        }
    ]
}
```

### 동적 규칙
<a name="dqdl-dynamic-rules"></a>

**참고**  
동적 규칙은 AWS Glue ETL에서만 지원되며 AWS Glue Data Catalog에서 지원되지 않습니다.

 이제 동적 규칙을 작성하여 규칙에 의해 생성된 현재 지표를 기록 값과 비교할 수 있습니다. 이러한 기록 비교는 표현식에 `last()` 연산자를 사용하여 사용할 수 있습니다. 예를 들어 현재 실행 중인 행 수가 동일한 데이터 세트에 대한 가장 최근의 이전 행 수보다 많을 때 규칙 `RowCount > last()`가 성공합니다. `last()`는 고려할 기록 지표의 개수를 나타내는 선택적 자연수 인수를 취하고, `last(k)`는 마지막 `k` 지표를 참조하는 `k >= 1`을 취합니다.
+ 사용 가능한 데이터 포인트가 없는 경우 `last(k)`는 기본값 0.0을 반환합니다.
+ 사용할 수 있는 지표가 `k`개 미만인 경우 `last(k)`는 이전 지표를 모두 반환합니다.

 유효한 표현식을 만들려면 `last(k)`를 사용합니다. 여기서 `k > 1`에는 여러 개의 기록 결과를 하나의 숫자로 줄이는 집계 함수가 필요합니다. 예를 들어 `RowCount > avg(last(5))`는 현재 데이터 세트의 행 수가 동일한 데이터 세트의 최근 5개 행 수의 평균보다 확실하게 큰지 확인합니다. `RowCount > last(5)`는 현재 데이터 세트 행 수를 목록과 유의미하게 비교할 수 없기 때문에 오류를 생성합니다.

 지원되는 집계 함수: 
+ `avg`
+ `median`
+ `max`
+ `min`
+ `sum`
+ `std`(표준 편차)
+ `abs`(절대값)
+  `index(last(k), i)`를 사용하면 최근 `k`개 중 가장 최근인 `i`번째 값을 선택할 수 있습니다. `i`는 0으로 인덱싱되므로 `index(last(3), 0)`은 가장 최근의 데이터 포인트를 반환하고, `index(last(3), 3)`은 데이터 포인트가 3개뿐이지만 4번째 가장 최근의 데이터 포인트를 인덱싱하려고 시도하기 때문에 오류가 발생합니다.

 **샘플 표현식** 

 **ColumnCorrelation** 
+ `ColumnCorrelation "colA" "colB" < avg(last(10))`

 **DistinctValuesCount** 
+ `DistinctValuesCount "colA" between min(last(10))-1 and max(last(10))+1`

 숫자 조건 또는 임곗값이 있는 대부분의 규칙 유형은 동적 규칙을 지원합니다. 제공된 테이블인 [분석기 및 규칙](#dqdl-analyzers-table)을 참조하여 해당 규칙 유형에 동적 규칙이 지원되는지 확인하세요.

 **동적 규칙에서 통계 제외** 

 때때로 동적 규칙 계산에서 데이터 통계를 제외해야 합니다. 과거 데이터 로드를 수행했지만 평균에 영향을 주지 않기를 원한다고 가정합니다. 이를 위해 AWS Glue ETL에서 작업을 열고 **데이터 품질** 탭을 선택한 다음, **통계**를 선택하고 제외하려는 통계를 선택합니다. 통계 테이블과 함께 추세 차트를 볼 수 있습니다. 제외하려는 값을 선택하고 **통계 제외**를 선택합니다. 이제 제외된 통계는 동적 규칙 계산에 포함되지 않습니다.

![\[스크린샷에서는 통계를 선택한 후 드롭다운 메뉴에서 통계를 제외하거나 포함하는 옵션을 보여줍니다.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/data-quality-excluding-statistics-from-dynamic-rules.png)


### 분석기
<a name="dqdl-analyzers"></a>

**참고**  
 분석기는 AWS Glue 데이터 카탈로그에서 지원되지 않습니다.

 DQDL 규칙은 분석기**라는 함수를 사용하여 데이터에 대한 정보를 수집합니다. 이 정보는 규칙의 부울 표현식에 의해 사용되어 규칙의 성공 또는 실패 여부를 결정합니다. 예를 들어 RowCount 규칙 `RowCount > 5 `는 행 수 분석기를 사용하여 데이터 세트의 행 수를 검색하고, 그 수를 표현식 `> 5`와 비교하여 현재 데이터 세트에 5개 이상의 행이 존재하는지 확인합니다.

 때로는 규칙을 작성하는 대신 분석기를 생성한 다음 이상을 탐지하는 데 사용할 수 있는 통계를 생성하는 것을 권장합니다. 이러한 경우에는 분석기를 생성할 수 있습니다. 분석기는 다음과 같은 점에서 규칙과 다릅니다.


| 기능 | 분석기 | 규칙 | 
| --- | --- | --- | 
| 규칙 세트의 일부 | 예 | 예 | 
| 통계 생성 | 예 | 예 | 
| 관찰 결과 생성 | 예 | 예 | 
| 조건 평가 및 어설션 가능 | 아니요 | 예 | 
| 실패 시 작업 중지, 작업 계속 처리 등의 작업을 구성할 수 있음 | 아니요 | 예 | 

 분석기는 규칙 없이 독립적으로 존재할 수 있으므로 신속하게 구성하고 데이터 품질 규칙을 점진적으로 구축할 수 있습니다.

 일부 규칙 유형은 규칙 세트의 `Analyzers` 블록에 입력하여 분석기에 필요한 규칙을 실행하고 조건에 대한 검사를 적용하지 않고 정보를 수집할 수 있습니다. 일부 분석기는 규칙과 연결되지 않으며 `Analyzers` 블록에만 입력할 수 있습니다. 다음 테이블에는 각 항목이 규칙 또는 독립 실행형 분석기로 지원되는지 여부와 각 규칙 유형에 대한 추가 세부 정보가 나와 있습니다.

 **분석기를 사용한 규칙 세트 예제** 

 다음 규칙 세트는 다음을 사용합니다.
+ 데이터 세트가 지난 세 번의 작업 실행에 대한 후행 평균보다 증가하고 있는지 확인하는 동적 규칙
+ 데이터 세트의 `Name` 열에 고유한 값의 수를 기록하는 `DistinctValuesCount` 분석기
+ 시간 경과에 따른 최소 및 최대 `Name` 크기를 추적하는 `ColumnLength` 분석기

 분석기 메트릭 결과는 작업 실행의 Data Quality 탭에서 확인할 수 있습니다.

```
Rules = [
   RowCount > avg(last(3))
]
Analyzers = [
   DistinctValuesCount "Name",
   ColumnLength "Name"
]
```

 AWS Glue Data Quality는 다음 분석기를 지원합니다.


| 분석기 이름 | 기능 | 
| --- | --- | 
| RowCount | 데이터 세트의 행 수를 계산합니다. | 
| Completeness | 열의 완전성 백분율을 계산합니다. | 
| Uniqueness | 열의 고유성 비율을 계산합니다. | 
| Mean | 숫자 열의 평균을 계산합니다. | 
| Sum | 숫자 열의 합계를 계산합니다. | 
| StandardDeviation | 숫자 열의 표준 편차를 계산합니다. | 
| Entropy | 숫자 열의 엔트로피를 계산합니다. | 
| DistinctValuesCount | 열의 고유 값 수를 계산합니다. | 
| UniqueValueRatio | 열의 고유 값 비율을 계산합니다. | 
| ColumnCount | 데이터 세트의 열 수를 계산합니다. | 
| ColumnLength | 열의 길이를 계산합니다. | 
| ColumnValues | 숫자 열의 최소값, 최대값을 계산합니다. 숫자가 아닌 열의 최소 열 길이 및 최대 열 길이를 계산합니다. | 
| ColumnCorrelation | 지정된 열의 열 상관 관계를 계산합니다. | 
| CustomSql | CustomSQL에서 반환된 통계를 계산합니다. | 
| AllStatistics | 다음 통계를 계산합니다.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/dqdl.html)  | 

### 설명
<a name="dqdl-syntax-comments"></a>

‘\$1’ 문자를 사용하여 DQDL 문서에 설명을 추가할 수 있습니다. ‘\$1’ 문자 이후부터 줄 끝까지의 모든 내용은 DQDL에서 무시됩니다.

```
Rules = [
    # More items should generally mean a higher price, so correlation should be positive
    ColumnCorrelation "price" "num_items" > 0
]
```

# DQDL 규칙 유형 참조
<a name="dqdl-rule-types"></a>

이 섹션에서는 AWS Glue 데이터 품질에서 지원하는 각 규칙 유형에 대한 참조를 제공합니다.

**참고**  
DQDL은 현재 중첩형 또는 목록형 열 데이터를 지원하지 않습니다.
아래 테이블의 괄호로 묶인 값은 규칙 인수에 제공된 정보로 대체됩니다.
규칙에는 일반적으로 표현식에 대한 추가 인수가 필요합니다.


| Ruletype | 설명 | 인수 | 보고된 지표 | 규칙으로 지원되나요? | 분석기로 지원되나요? | 행 수준 결과를 반환하나요? | 동적 규칙이 지원되나요? | 관찰 결과 생성 | Where 절 구문을 지원합니까? | 
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | 
| AggregateMatch | 총 판매액과 같은 요약 지표를 비교하여 두 데이터 세트가 일치하는지 확인합니다. 금융 기관에서 모든 데이터가 소스 시스템에서 수집되었는지 비교할 때 유용합니다. | 하나 이상의 집계 |  첫 번째 및 두 번째 집계 열 이름이 일치하는 경우: `Column.[Column].AggregateMatch` 첫 번째 및 두 번째 집계 열 이름이 다른 경우: `Column.[Column1,Column2].AggregateMatch`  | 예 | 아니요 | 아니요 | 아니요 | 아니요 | 아니요 | 
| AllStatistics | 데이터 세트의 제공된 열에 대한 여러 지표를 수집하는 독립 실행형 분석기 | 단일 열 이름 |  모든 유형의 열에 적용됩니다. `Dataset.*.RowCount` `Column.[Column].Completeness` `Column.[Column].Uniqueness` 문자열 값 열에 대한 추가 지표: `ColumnLength metrics` 숫자 값 열에 대한 추가 지표: `ColumnValues metrics`  | 아니요 | 예 | 아니요 | 아니요 | 아니요 | 아니요 | 
| ColumnCorrelation | 두 열의 상관 관계 수준을 확인합니다. | 정확히 두 개의 열 이름 | Multicolumn.[Column1,Column2].ColumnCorrelation | 예 | 예 | 아니요 | 예 | 아니요 | 예 | 
| ColumnCount | 삭제된 열이 있는지 확인합니다. | 없음 | Dataset.\$1.ColumnCount | 예 | 예 | 아니요 | 예 | 예 | 아니요 | 
| ColumnDataType | 열이 데이터 형식을 준수하는지 확인합니다. | 정확히 하나의 열 이름 | Column.[Column].ColumnDataType.Compliance | 예 | 아니요 | 아니요 | 예, 행 수준 임곗값 표현식에서 | 아니요 | 예 | 
| ColumnExists | 데이터 세트에 열이 있는지 확인합니다. 이를 통해 고객은 특정 열을 사용할 수 있도록 셀프 서비스 데이터 플랫폼을 구축할 수 있습니다. | 정확히 하나의 열 이름 | N/A | 예 | 아니요 | 아니요 | 아니요 | 아니요 | 아니요 | 
| ColumnLength | 데이터 길이가 일관되는지 확인합니다. | 정확히 하나의 열 이름 |  `Column.[Column].MaximumLength` `Column.[Column].MinimumLength` 행 수준 임곗값이 제공된 경우 추가 지표: `Column.[Column].ColumnValues.Compliance`  | 예 | 예 | 예, 행 수준 임곗값이 제공된 경우 | 아니요 | 예. 최소 및 최대 길이를 분석하여 관찰 결과만 생성합니다. | 예 | 
| ColumnNamesMatchPattern | 열 이름이 정의된 패턴과 일치하는지 확인합니다. 거버넌스 팀이 열 이름의 일관성을 적용하는 데 유용합니다. | 열 이름에 대한 정규식 | Dataset.\$1.ColumnNamesPatternMatchRatio | 예 | 아니요 | 아니요 | 아니요 | 아니요 | 아니요 | 
| ColumnValues | 데이터가 정의된 값에 따라 일관되는지 확인합니다. 이 규칙은 정규식을 지원합니다. | 정확히 하나의 열 이름 |  `Column.[Column].Maximum` `Column.[Column].Minimum` 행 수준 임곗값이 제공된 경우 추가 지표: `Column.[Column].ColumnValues.Compliance`  | 예 | 예 | 예, 행 수준 임곗값이 제공된 경우 | 아니요 | 예. 최솟값 및 최댓값을 분석하여 관찰 결과만 생성합니다. | 예 | 
| 완전성 | 데이터에 공백 또는 NULL이 있는지 확인합니다. | 정확히 하나의 열 이름 | `Column.[Column].Completeness` | 예 | 예 | 예 | 예 | 예 | 예 | 
| CustomSql |  고객은 거의 모든 유형의 데이터 품질 검사를 SQL로 구현할 수 있습니다. |  SQL 문 (선택 사항) 행 수준 임곗값  |  `Dataset.*.CustomSQL` 행 수준 임곗값이 제공된 경우 추가 지표: `Dataset.*.CustomSQL.Compliance`  | 예 | 아니요 | 예, 행 수준 임곗값이 제공된 경우 | 예 | 아니요 | 아니요 | 
| DataFreshness | 데이터가 최신인지 확인합니다. | 정확히 하나의 열 이름 | Column.[Column].DataFreshness.Compliance | 예 | 아니요 | 예 | 아니요 | 아니요 | 예 | 
| DatasetMatch | 두 데이터 세트를 비교하여 두 데이터 세트가 동기화되었는지 확인합니다. |  참조 데이터 세트 이름 열 매핑 (선택 사항) 일치하는 항목이 있는지 확인하는 열  | Dataset.[ReferenceDatasetAlias].DatasetMatch | 예 | 아니요 | 예 | 예 | 아니요 | 아니요 | 
| DistinctValuesCount | 중복된 값이 있는지 확인합니다. | 정확히 하나의 열 이름 | Column.[Column].DistinctValuesCount | 예 | 예 | 예 | 예 | 예 | 예 | 
| DetectAnomalies | 다른 규칙 유형의 보고된 지표에서 이상이 있는지 확인합니다. | 규칙 유형 | 규칙 유형 인수로 보고된 지표 | 예 | 아니요 | 아니요 | 아니요 | 아니요 | 아니요 | 
| Entropy | 데이터의 엔트로피를 확인합니다. | 정확히 하나의 열 이름 | Column.[Column].Entropy | 예 | 예 | 아니요 | 예 | 아니요 | 예 | 
| IsComplete | 데이터가 100% 완전한지 확인합니다. | 정확히 하나의 열 이름 | Column.[Column].Completeness | 예 | 아니요 | 예 | 아니요 | 아니요 | 예 | 
| IsPrimaryKey | 열이 프라이머리 키(NULL이 아니고 고유함)인지 확인합니다. | 정확히 하나의 열 이름 |  단일 열의 경우: `Column.[Column].Uniqueness` 여러 열의 경우: `Multicolumn.[CommaDelimitedColumns].Uniqueness`  | 예 | 아니요 | 예 | 아니요 | 아니요 | 예 | 
| IsUnique | 데이터가 100% 고유한지 확인합니다. | 정확히 하나의 열 이름 | Column.[Column].Uniqueness | 예 | 아니요 | 예 | 아니요 | 아니요 | 예 | 
| 평균 | 평균이 설정된 임곗값과 일치하는지 확인합니다. | 정확히 하나의 열 이름 | Column.[Column].Mean | 예 | 예 | 예 | 예 | 아니요 | 예 | 
| ReferentialIntegrity | 두 데이터 세트에 참조 무결성이 있는지 확인합니다. |  데이터 세트에서 하나 이상의 열 이름 참조 데이터 세트에서 가져온 하나 이상의 열 이름  | Column.[ReferenceDatasetAlias].ReferentialIntegrity | 예 | 아니요 | 예 | 예 | 아니요 | 아니요 | 
| RowCount | 레코드 수가 임곗값과 일치하는지 확인합니다. | 없음 | Dataset.\$1.RowCount | 예 | 예 | 아니요 | 예 | 예 | 예 | 
| RowCountMatch | 두 데이터 세트 사이에서 레코드 수가 일치하는지 확인합니다. | 참조 데이터 세트 별칭 | Dataset.[ReferenceDatasetAlias].RowCountMatch | 예 | 아니요 | 아니요 | 예 | 아니요 | 아니요 | 
| StandardDeviation | 표준 편차가 임곗값과 일치하는지 확인합니다. | 정확히 하나의 열 이름 | Column.[Column].StandardDeviation | 예 | 예 | 예 | 예 | 아니요 | 예 | 
| SchemaMatch | 두 데이터 세트 사이에서 스키마가 일치하는지 확인합니다. | 참조 데이터 세트 별칭 | Dataset.[ReferenceDatasetAlias].SchemaMatch | 예 | 아니요 | 아니요 | 예 | 아니요 | 아니요 | 
| Sum | 합계가 설정된 임곗값과 일치하는지 확인합니다. | 정확히 하나의 열 이름 | Column.[Column].Sum | 예 | 예 | 아니요 | 예 | 아니요 | 예 | 
| Uniqueness | 데이터 세트의 고유성이 임곗값과 일치하는지 확인합니다. | 정확히 하나의 열 이름 | Column.[Column].Uniqueness | 예 | 예 | 예 | 예 | 아니요 | 예 | 
| UniqueValueRatio | 고유 값 비율이 임곗값과 일치하는지 확인합니다. | 정확히 하나의 열 이름 | Column.[Column].UniqueValueRatio | 예 | 예 | 예 | 예 | 아니요 | 예 | 
| FileFreshness | Amazon S3의 파일이 새 파일인지 확인합니다. | 파일 또는 폴더 경로와 임계치. |  `Dataset.*.FileFreshness.Compliance` `Dataset.*.FileCount`  | 예 | 아니요 | 아니요 | 아니요 | 아니요 | 아니요 | 
| FileMatch | 파일 내용이 체크섬 또는 다른 파일과 일치하는지 확인합니다. 이 규칙은 체크섬을 사용하여 두 파일이 동일한지 검증합니다. | 소스 파일 또는 폴더 경로와 대상 파일 또는 폴더 경로. | 통계가 생성되지 않습니다. | 예 | 아니요 | 아니요 | 아니요 | 아니요 | 아니요 | 
| FileSize | 파일 크기가 지정된 조건과 일치하는지 확인합니다. | 파일 또는 폴더 경로와 임계치. | `Dataset.*.FileSize.Compliance` `Dataset.*.FileCount` `Dataset.*.MaximumFileSize` `Dataset.*.MinimumFileSize`  | 예 | 아니요 | 아니요 | 아니요 | 아니요 | 아니요 | 
| FileUniqueness | 체크섬을 사용하여 파일이 고유한지 확인합니다. | 파일 또는 폴더 경로와 임계치. | `Dataset.*.FileUniquenessRatio` `Dataset.*.FileCount`  | 예 | 아니요 | 아니요 | 아니요 | 아니요 | 아니요 | 

**Topics**
+ [AggregateMatch](dqdl-rule-types-AggregateMatch.md)
+ [ColumnCorrelation](dqdl-rule-types-ColumnCorrelation.md)
+ [ColumnCount](dqdl-rule-types-ColumnCount.md)
+ [ColumnDataType](dqdl-rule-types-ColumnDataType.md)
+ [ColumnExists](dqdl-rule-types-ColumnExists.md)
+ [ColumnLength](dqdl-rule-types-ColumnLength.md)
+ [ColumnNamesMatchPattern](dqdl-rule-types-ColumnNamesMatchPattern.md)
+ [ColumnValues](dqdl-rule-types-ColumnValues.md)
+ [완전성](dqdl-rule-types-Completeness.md)
+ [CustomSQL](dqdl-rule-types-CustomSql.md)
+ [DataFreshness](dqdl-rule-types-DataFreshness.md)
+ [DatasetMatch](dqdl-rule-types-DatasetMatch.md)
+ [DistinctValuesCount](dqdl-rule-types-DistinctValuesCount.md)
+ [Entropy](dqdl-rule-types-Entropy.md)
+ [IsComplete](dqdl-rule-types-IsComplete.md)
+ [IsPrimaryKey](dqdl-rule-types-IsPrimaryKey.md)
+ [IsUnique](dqdl-rule-types-IsUnique.md)
+ [Mean](dqdl-rule-types-Mean.md)
+ [ReferentialIntegrity](dqdl-rule-types-ReferentialIntegrity.md)
+ [RowCount](dqdl-rule-types-RowCount.md)
+ [RowCountMatch](dqdl-rule-types-RowCountMatch.md)
+ [StandardDeviation](dqdl-rule-types-StandardDeviation.md)
+ [Sum](dqdl-rule-types-Sum.md)
+ [SchemaMatch](dqdl-rule-types-SchemaMatch.md)
+ [Uniqueness](dqdl-rule-types-Uniqueness.md)
+ [UniqueValueRatio](dqdl-rule-types-UniqueValueRatio.md)
+ [DetectAnomalies](dqdl-rule-types-DetectAnomalies.md)
+ [FileFreshness](dqdl-rule-types-FileFreshness.md)
+ [FileMatch](dqdl-rule-types-FileMatch.md)
+ [FileUniqueness](dqdl-rule-types-FileUniqueness.md)
+ [FileSize](dqdl-rule-types-FileSize.md)

# AggregateMatch
<a name="dqdl-rule-types-AggregateMatch"></a>

지정된 표현식에서 두 열의 집계 비율을 확인합니다. 이 규칙 유형은 여러 데이터 세트에 적용됩니다. 두 열의 집계를 평가하고 첫 번째 열 집계 결과를 두 번째 열 집계 결과로 나누어 비율을 생성합니다. 제공된 표현식에서 비율을 확인하여 부울 응답을 생성합니다.

**구문**

**열 집계**

```
AggregateMatch <AGG_OPERATION> (<OPTIONAL_REFERENCE_ALIAS>.<COL_NAME>)
```
+ **AGG\$1OPERATION** – 집계에 사용할 연산입니다. 현재 `sum` 및 `avg`가 지원됩니다.

  **지원되는 열 유형**: Byte, Decimal, Double, Float, Integer, Long, Short
+ **OPTIONAL\$1REFERENCE\$1ALIAS** – 기본 데이터 세트가 아닌 참조 데이터 세트에서 열을 가져온 경우 이 파라미터를 제공해야 합니다. AWS Glue 데이터 카탈로그에서 이 규칙을 사용하는 경우 참조 별칭은 '<database\$1name>.<table\$1name>.<column\$1name>' 형식을 따라야 합니다.

  **지원되는 열 유형**: Byte, Decimal, Double, Float, Integer, Long, Short
+ **COL\$1NAME** - 집계할 열의 이름입니다.

  **지원되는 열 유형**: Byte, Decimal, Double, Float, Integer, Long, Short

**예: 평균**

```
"avg(rating)"
```

**예: 합계**

```
"sum(amount)"
```

**예: 참조 데이터 세트의 열 평균**

```
"avg(reference.rating)"
```

**규칙**

```
AggregateMatch <AGG_EXP_1> <AGG_EXP_2> <EXPRESSION>
```
+ **AGG\$1EXP\$11** - 첫 번째 열 집계입니다.

  지원되는 열 유형: Byte, Decimal, Double, Float, Integer, Long, Short

  **지원되는 열 유형**: Byte, Decimal, Double, Float, Integer, Long, Short
+ **AGG\$1EXP\$12** - 두 번째 열 집계입니다.

  지원되는 열 유형: Byte, Decimal, Double, Float, Integer, Long, Short

  **지원되는 열 유형**: Byte, Decimal, Double, Float, Integer, Long, Short
+ **EXPRESSION** - 부울 값을 생성하기 위해 규칙 유형 응답에 대해 실행할 표현식입니다. 자세한 내용은 [Expressions](dqdl.md#dqdl-syntax-rule-expressions) 섹션을 참조하세요.

**예: 합계를 사용한 일치 항목 집계**

다음 예제 규칙은 `amount` 열에서 값의 합계가 `total_amount` 열에서 값의 합계와 정확히 같은지 여부를 확인합니다.

```
AggregateMatch "sum(amount)" "sum(total_amount)" = 1.0
```

**예: 평균을 사용한 일치 항목 집계**

다음 예제 규칙은 `ratings` 열에서 값의 평균이 `reference` 데이터 세트 내 `ratings` 열에서 값의 평균 중 90% 이상인지를 확인합니다. 참조 데이터 세트는 ETL 또는 데이터 카탈로그 환경에서 추가 데이터 소스로 제공됩니다.

AWS Glue ETL에서 다음을 사용할 수 있습니다.

```
AggregateMatch "avg(ratings)" "avg(reference.ratings)" >= 0.9
```

AWS Glue 데이터 카탈로그에서 다음을 사용할 수 있습니다.

```
AggregateMatch "avg(ratings)" "avg(database_name.tablename.ratings)" >= 0.9
```

**Null 동작**

 `AggregateMatch` 규칙은 집계 방법(합계/평균)의 계산에서 NULL 값이 있는 행을 무시합니다. 예: 

```
+---+-----------+
|id |units      |
+---+-----------+
|100|0          | 
|101|null       |
|102|20         |
|103|null       |
|104|40         |
+---+-----------+
```

 `units`열의 평균은 (0 \$1 20 \$1 40)/3 = 20이 됩니다. 101행과 103행은 이 계산에서 고려되지 않습니다.

# ColumnCorrelation
<a name="dqdl-rule-types-ColumnCorrelation"></a>

주어진 표현식을 기준으로 두 열 간의 **상관 관계를 확인합니다. AWS Glue 데이터 품질에서는 피어슨 상관 계수를 사용하여 두 열 간의 선형 상관 관계를 측정합니다. 결과는 관계의 강도와 방향을 측정하는 -1과 1 사이의 숫자입니다.

**구문**

```
ColumnCorrelation <COL_1_NAME> <COL_2_NAME> <EXPRESSION>
```
+ **COL\$11\$1NAME** - 데이터 품질 규칙을 평가할 첫 번째 열의 이름입니다.

  **지원되는 열 유형**: Byte, Decimal, Double, Float, Integer, Long, Short
+ **COL\$12\$1NAME** - 데이터 품질 규칙을 평가할 첫 번째 열의 이름입니다.

  **지원되는 열 유형**: Byte, Decimal, Double, Float, Integer, Long, Short
+ **EXPRESSION** - 부울 값을 생성하기 위해 규칙 유형 응답에 대해 실행할 표현식입니다. 자세한 내용은 [Expressions](dqdl.md#dqdl-syntax-rule-expressions) 섹션을 참조하세요.

**예: 열 상관 관계**

다음 예제 규칙은 열 `height` 및 `weight` 간의 상관 계수가 강한 양의 상관 관계(0.8보다 큰 계수 값)를 갖는지 여부를 확인합니다.

```
ColumnCorrelation "height" "weight" > 0.8
```

```
ColumnCorrelation "weightinkgs" "Salary" > 0.8 where "weightinkgs > 40"
```

 **샘플 동적 규칙** 
+ `ColumnCorrelation "colA" "colB" between min(last(10)) and max(last(10))`
+ `ColumnCorrelation "colA" "colB" < avg(last(5)) + std(last(5))`

**Null 동작**

 `ColumnCorrelation` 규칙은 상관 관계 계산에서 `NULL` 값이 있는 행을 무시합니다. 예: 

```
+---+-----------+
|id |units      |
+---+-----------+
|100|0          | 
|101|null       |
|102|20         |
|103|null       |
|104|40         |
+---+-----------+
```

 101행과 103행은 무시되고 `ColumnCorrelation`이 1.0이 됩니다.

# ColumnCount
<a name="dqdl-rule-types-ColumnCount"></a>

지정된 표현식을 기준으로 기본 데이터 세트의 열 수를 확인합니다. 표현식에서 `>` 및 `<` 같은 연산자를 사용하여 열 수 또는 열 범위를 지정할 수 있습니다.

**구문**

```
ColumnCount <EXPRESSION>
```
+ **EXPRESSION** - 부울 값을 생성하기 위해 규칙 유형 응답에 대해 실행할 표현식입니다. 자세한 내용은 [Expressions](dqdl.md#dqdl-syntax-rule-expressions) 섹션을 참조하세요.

**예: 열 수 숫자 검사**

다음 예제 규칙은 열 수가 지정된 범위 내에 있는지 확인합니다.

```
ColumnCount between 10 and 20
```

**샘플 동적 규칙**
+ `ColumnCount >= avg(last(10))`
+ `ColumnCount between min(last(10))-1 and max(last(10))+1`

# ColumnDataType
<a name="dqdl-rule-types-ColumnDataType"></a>

 지정된 열의 값을 Apache Spark에서 제공된 유형으로 캐스팅할 수 있는지 여부를 확인합니다. `with threshold` 식을 수락하여 열에 있는 값의 하위 세트를 확인합니다.

 **구문** 

```
ColumnDataType <COL_NAME> = <EXPECTED_TYPE>
```
+ **COL\$1NAME** - 데이터 품질 규칙을 평가할 열의 이름입니다.

  지원되는 열 유형: 문자열 유형

  **지원되는 열 유형**: Byte, Decimal, Double, Float, Integer, Long, Short
+ **EXPECTED\$1TYPE** - 열에 있는 값의 예상 유형입니다.

  지원되는 값: Boolean, Date, Timestamp, Integer, Double, Float, Long

  **지원되는 열 유형**: Byte, Decimal, Double, Float, Integer, Long, Short
+ **EXPRESSION** - 예상 유형이어야 하는 값의 백분율을 지정하는 선택적 표현식입니다.

  **지원되는 열 유형**: Byte, Decimal, Double, Float, Integer, Long, Short

 **예: 열 데이터 형식 정수 역할의 문자열** 

 다음 예제 규칙은 문자열 유형인 지정된 열의 값을 정수로 캐스팅할 수 있는지 여부를 확인합니다.

```
ColumnDataType "colA" = "INTEGER"
```

 **예: 열 데이터 형식 정수 역할의 문자열에서 값의 하위 세트 확인** 

 다음 예제 규칙은 문자열 유형인 지정된 열의 값 중 90%를 정수로 캐스팅할 수 있는지 여부를 확인합니다.

```
ColumnDataType "colA" = "INTEGER" with threshold > 0.9
```

# ColumnExists
<a name="dqdl-rule-types-ColumnExists"></a>

열이 존재하는지 확인합니다.

**구문**

```
ColumnExists <COL_NAME>
```
+ **COL\$1NAME** - 데이터 품질 규칙을 평가할 열의 이름입니다.

  **지원되는 열 유형**: 모든 열 유형

**예: 열이 존재함**

다음 예제 규칙은 `Middle_Name` 열이 존재하는지 여부를 확인합니다.

```
ColumnExists "Middle_Name"
```

# ColumnLength
<a name="dqdl-rule-types-ColumnLength"></a>

열에 있는 각 행의 길이가 지정된 표현식을 준수하는지 확인합니다.

**구문**

```
ColumnLength <COL_NAME><EXPRESSION>
```
+ **COL\$1NAME** - 데이터 품질 규칙을 평가할 열의 이름입니다.

  **지원되는 열 유형**: 문자열
+ **EXPRESSION** - 부울 값을 생성하기 위해 규칙 유형 응답에 대해 실행할 표현식입니다. 자세한 내용은 [Expressions](dqdl.md#dqdl-syntax-rule-expressions) 섹션을 참조하세요.

**예: 열 행 길이**

다음 예제 규칙은 `Postal_Code` 열의 각 행에 있는 값의 길이가 5자인지 여부를 확인합니다.

```
ColumnLength "Postal_Code" = 5
ColumnLength "weightinkgs" = 2 where "weightinkgs > 10"
```

**Null 동작**

 `ColumnLength` 규칙은 `NULL`을 0 길이 문자열로 취급합니다. `NULL` 행의 경우: 

```
ColumnLength "Postal_Code" > 4 # this will fail
```

```
ColumnLength "Postal_Code" < 6 # this will succeed 
```

 다음 예시 복합 규칙은 `NULL` 값을 명시적으로 실패하도록 하는 방법을 제공합니다.

```
(ColumnLength "Postal_Code" > 4) AND (ColumnValues "Postal_Code" != NULL)
```

# ColumnNamesMatchPattern
<a name="dqdl-rule-types-ColumnNamesMatchPattern"></a>

기본 데이터 세트의 모든 열 이름이 지정된 정규식과 일치하는지 확인합니다.

**구문**

```
ColumnNamesMatchPattern <PATTERN>
```
+ **PATTERN** – 데이터 품질 규칙을 평가하는 데 사용할 패턴입니다.

  **지원되는 열 유형**: Byte, Decimal, Double, Float, Integer, Long, Short

**예: 열 이름 일치 패턴**

다음 예제 규칙은 모든 열이 접두사 'aws\$1'로 시작하는지 여부를 확인합니다.

```
ColumnNamesMatchPattern "aws_.*"
ColumnNamesMatchPattern "aws_.*" where "weightinkgs > 10"
```

# ColumnValues
<a name="dqdl-rule-types-ColumnValues"></a>

열의 값에 대해 표현식을 실행합니다.

**구문**

```
ColumnValues <COL_NAME> <EXPRESSION>
```
+ **COL\$1NAME** - 데이터 품질 규칙을 평가할 열의 이름입니다.

  **지원되는 열 유형**: 모든 열 유형
+ **EXPRESSION** - 부울 값을 생성하기 위해 규칙 유형 응답에 대해 실행할 표현식입니다. 자세한 내용은 [Expressions](dqdl.md#dqdl-syntax-rule-expressions) 섹션을 참조하세요.

**예: 허용된 값**

다음 예제 규칙은 지정된 열의 각 값이 허용되는 값 세트(null, 비어 있음, 공백만 있는 문자열 포함)에 있는지 확인합니다.

```
ColumnValues "Country" in [ "US", "CA", "UK", NULL, EMPTY, WHITESPACES_ONLY ]
ColumnValues "gender" in ["F", "M"] where "weightinkgs < 10"
```

**예: 정규 표현식**

다음 예제 규칙은 열의 값을 정규 표현식과 비교하여 검사합니다.

```
ColumnValues "First_Name" matches "[a-zA-Z]*"
```

**예: 날짜 값**

다음 예제 규칙은 날짜 열의 값을 날짜 표현식과 비교하여 검사합니다.

```
ColumnValues "Load_Date" > (now() - 3 days)
```

**예: 숫자 값**

다음 예제 규칙은 열 값이 특정 숫자 제약 조건과 일치하는지 여부를 확인합니다.

```
ColumnValues "Customer_ID" between 1 and 2000
```

**Null 동작**

 모든 `ColumnValues` 규칙(`!=` 및 `NOT IN` 제외)의 경우 `NULL` 행이 규칙에 실패합니다. null 값으로 인해 규칙이 실패하면 실패 이유가 다음과 같이 표시됩니다.

```
Value: NULL does not meet the constraint requirement!
```

 다음 예제 복합 규칙은 `NULL` 값을 명시적으로 허용하는 방법을 제공합니다.

```
(ColumnValues "Age" > 21) OR (ColumnValues "Age" = NULL)
```

 `!=` 및 `not in` 구문을 사용하는 부정 ColumnValues 규칙은 `NULL` 행에 대해 성공합니다. 예: 

```
ColumnValues "Age" != 21
```

```
ColumnValues "Age" not in [21, 22, 23]
```

 다음 예제는 `NULL` 값을 명시적으로 실패하도록 하는 방법을 제공합니다.

```
(ColumnValues "Age" != 21) AND (ColumnValues "Age" != NULL)
```

```
ColumnValues "Age" not in [21, 22, 23, NULL]
```

# 완전성
<a name="dqdl-rule-types-Completeness"></a>

지정된 표현식을 기준으로 열에서 전체(null이 아닌) 값의 백분율을 검사합니다.

**구문**

```
Completeness <COL_NAME> <EXPRESSION>
```
+ **COL\$1NAME** - 데이터 품질 규칙을 평가할 열의 이름입니다.

  **지원되는 열 유형**: 모든 열 유형
+ **EXPRESSION** - 부울 값을 생성하기 위해 규칙 유형 응답에 대해 실행할 표현식입니다. 자세한 내용은 [Expressions](dqdl.md#dqdl-syntax-rule-expressions) 섹션을 참조하세요.

**예: Null 값 백분율**

다음 예제 규칙은 열에 있는 값의 95% 이상이 완전한지를 확인합니다.

```
Completeness "First_Name" > 0.95
Completeness "First_Name" > 0.95 where "weightinkgs > 10"
```

 **샘플 동적 규칙** 
+ `Completeness "colA" between min(last(5)) - 1 and max(last(5)) + 1`
+ `Completeness "colA" <= avg(last(10))`

**Null 동작**

 CSV 데이터 형식에 대한 참고 사항: CSV 열의 빈 행은 여러 동작을 표시할 수 있습니다.
+  열의 유형이 `String`인 경우 빈 행은 빈 문자열로 인식되어 `Completeness` 규칙에 실패하지 않습니다.
+  열이 `Int`와 같은 다른 데이터 유형인 경우 빈 행이 `NULL`로 인식되어 `Completeness` 규칙에 실패합니다.

# CustomSQL
<a name="dqdl-rule-types-CustomSql"></a>

이 규칙 유형은 다음과 같은 두 가지 사용 사례를 지원하도록 확장되었습니다.
+ 데이터 세트에 대해 사용자 지정 SQL 문을 실행하고 지정된 표현식을 기준으로 반환 값을 확인합니다.
+ 일부 조건과 비교하여 행 수준 결과를 얻는 SELECT 문에 열 이름을 지정하는 사용자 지정 SQL 문을 실행합니다.

**구문**

```
CustomSql <SQL_STATEMENT> <EXPRESSION>
```
+ **SQL\$1STATEMENT** - 큰따옴표로 묶인 단일 숫자 값을 반환하는 SQL 문입니다.
+ **EXPRESSION** - 부울 값을 생성하기 위해 규칙 유형 응답에 대해 실행할 표현식입니다. 자세한 내용은 [Expressions](dqdl.md#dqdl-syntax-rule-expressions) 섹션을 참조하세요.

**예: 전체 규칙 결과를 검색하기 위한 사용자 지정 SQL**

이 예제 규칙에서는 SQL 문을 사용하여 데이터 세트의 레코드 수를 검색합니다. 그런 다음 레코드 수가 10\$120 사이인지 확인합니다.

```
CustomSql "select count(*) from primary" between 10 and 20
```

**예: 행 수준 결과를 검색하기 위한 사용자 지정 SQL**

이 예제 규칙은 일부 조건과 비교하여 행 수준 결과를 얻는 SELECT 문에 열 이름을 지정하는 SQL 문을 사용합니다. 임곗값 조건 표현식에서는 전체 규칙이 실패하기 위해 실패해야 하는 레코드 수의 임곗값을 정의합니다. 규칙에는 조건과 키워드가 모두 포함되지 않을 수도 있습니다.

```
CustomSql "select Name from primary where Age  > 18"
```

or

```
CustomSql "select Name from primary where Age > 18" with threshold  > 3
```

**중요**  
`primary` 별칭은 평가하려는 데이터 세트의 이름을 나타냅니다. 콘솔에서 시각적 ETL 작업을 수행할 때 `primary`에서는 항상 `EvaluateDataQuality.apply()` 변환에 전달 중인 `DynamicFrame`을 나타냅니다. AWS Glue 데이터 카탈로그를 사용하여 테이블에 대해 데이터 품질 작업을 실행하는 경우 `primary`는 테이블을 나타냅니다.

AWS Glue 데이터 카탈로그에 있는 경우 실제 테이블 이름을 사용할 수도 있습니다.

```
CustomSql "select count(*) from database.table" between 10 and 20
```

여러 테이블을 조인하여 서로 다른 데이터 요소를 비교할 수도 있습니다.

```
CustomSql "select count(*) from database.table inner join database.table2 on id1 = id2" between 10 and 20
```

 AWS Glue ETL에서 CustomSQL은 데이터 품질 검사에 실패한 레코드를 식별할 수 있습니다. 이 작업을 수행하려면 데이터 품질을 평가하려는 기본 테이블의 일부인 레코드를 반환해야 합니다. 쿼리의 일부로 반환된 레코드는 성공으로 간주되고 반환되지 않은 레코드는 실패로 간주됩니다. 이는 CustomSQL 쿼리의 결과를 원래 데이터세트와 조인하는 방식으로 작동합니다. SQL 쿼리의 복잡성에 따라 성능에 영향을 미칠 수 있습니다.

 방법: 
+  기본 테이블에서 열을 하나 이상 선택해야 합니다.
  +  `select count(*) from primary`는 OVERALL CustomSQL DQ 규칙에 대한 유효한 쿼리이지만 행 수준 사용자 지정 SQL에는 유효하지 않습니다.
  +  이 규칙은 평가 중에 오류를 발생시킵니다. `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 the columns from the SQL result are not present in the Input Dataset. Ensure that matching columns are returned from the SQL.` 
+  SQL 쿼리에서는 테이블에서 '프라이머리 키'를 선택하거나 복합 키를 구성하는 열 세트를 선택합니다. 이렇게 하지 않으면 중복된 행이 일치되어 결과가 일관되지 않고 성능이 저하될 수 있습니다.
+  기본 테이블에서만 키를 선택하고 참조 테이블에서는 선택하지 않습니다.

다음 규칙에서는 age가 100 미만인 레코드는 성공으로, 그 이상인 레코드는 실패로 표시됩니다.

```
CustomSql "select id from primary where age < 100" 
```

레코드 중 50%에서 age가 10을 초과하는 경우 이 CustomSQL 규칙은 통과되며 실패한 레코드도 식별합니다. 이 CustomSQL에서 반환된 레코드는 통과로 간주되고 반환되지 않은 레코드는 실패로 간주됩니다.

```
CustomSQL "select ID, CustomerID from primary where age > 10" with threshold > 0.5
```

참고: 데이터 세트에서 사용할 수 없는 레코드를 반환하면 CustomSQL 규칙이 실패합니다.

# DataFreshness
<a name="dqdl-rule-types-DataFreshness"></a>

현재 시간과 날짜 열 값 간의 차이를 평가하여 열에 있는 데이터의 최신성을 검사합니다. 이 규칙 유형에 시간 기반 표현식을 지정하여 열 값이 최신 상태인지 확인할 수 있습니다.

**구문**

```
DataFreshness <COL_NAME> <EXPRESSION>
```
+ **COL\$1NAME** - 데이터 품질 규칙을 평가할 열의 이름입니다.

  **지원되는 열 유형**: 날짜 
+ **표현식** - 시간 또는 일 단위의 숫자 표현식입니다. 표현식에 시간 단위를 지정해야 합니다.

**예: 데이터 최신성**

다음 예제 규칙은 데이터 최신성을 확인합니다.

```
DataFreshness "Order_Date" <= 24 hours
DataFreshness "Order_Date" between 2 days and 5 days
```

**Null 동작**

 `DataFreshness` 규칙은 `NULL` 값이 있는 행에 대해 실패합니다. null 값으로 인해 규칙이 실패하면 실패 이유가 다음과 같이 표시됩니다.

```
80.00 % of rows passed the threshold
```

 여기서 실패한 행의 20%에는 `NULL`이 있는 행이 포함됩니다.

 다음 예제 복합 규칙은 `NULL` 값을 명시적으로 허용하는 방법을 제공합니다.

```
(DataFreshness "Order_Date" <= 24 hours) OR (ColumnValues "Order_Date" = NULL)
```

**Amazon S3 객체의 데이터 최신성**

 Amazon S3 파일 생성 시간을 기준으로 데이터의 최신성을 검증해야 하는 경우가 있습니다. 이렇게 하려면 다음 코드를 사용하여 타임스탬프를 가져와 데이터 프레임에 추가한 다음 데이터 최신성 검사를 적용할 수 있습니다.

```
df = glueContext.create_data_frame.from_catalog(database = "default", table_name = "mytable")
df = df.withColumn("file_ts", df["_metadata.file_modification_time"])

Rules = [
 DataFreshness "file_ts" < 24 hours 
]
```

# DatasetMatch
<a name="dqdl-rule-types-DatasetMatch"></a>

 기본 데이터 세트의 데이터가 참조 데이터 세트의 데이터와 일치하는지 확인합니다. 제공된 키 열 매핑을 사용하여 두 데이터 세트를 조인합니다. 해당 열에서만 데이터의 관계(equality)를 확인하려는 경우 추가 열 매핑을 제공할 수 있습니다. **DataSetMatch**를 사용하려면 조인 키가 고유해야 하고 NULL이 아니어야 합니다(프라이머리 키여야 함). 이러한 조건을 충족하지 않으면 'Provided key map not suitable for given data frames' 오류 메시지가 표시됩니다. 고유한 조인 키를 사용할 수 없는 경우에는 **AggregateMatch**와 같은 다른 규칙 유형을 사용하여 요약 데이터와 일치시키는 것이 좋습니다.

**구문**

```
DatasetMatch <REFERENCE_DATASET_ALIAS> <JOIN CONDITION WITH MAPPING> <OPTIONAL_MATCH_COLUMN_MAPPINGS> <EXPRESSION>
```
+ **REFERENCE\$1DATASET\$1ALIAS** – 기본 데이터 세트의 데이터를 비교하는 참조 데이터 세트의 별칭입니다.
+ **KEY\$1COLUMN\$1MAPPINGS** – 데이터 세트의 키를 구성하는 쉼표로 구분된 열 이름 목록입니다. 두 데이터 세트의 열 이름이 동일하지 않은 경우 `->`로 구분해야 합니다.
+ **OPTIONAL\$1MATCH\$1COLUMN\$1MAPPINGS** - 특정 열의 데이터만 일치하는지 확인하려는 경우 이 파라미터를 제공할 수 있습니다. 키 열 매핑과 동일한 구문을 사용합니다. 이 파라미터를 제공하지 않으면 나머지 모든 열의 데이터를 일치시킵니다. 키가 아닌 나머지 열은 두 데이터 세트에서 이름이 같아야 합니다.
+ **EXPRESSION** - 부울 값을 생성하기 위해 규칙 유형 응답에 대해 실행할 표현식입니다. 자세한 내용은 [Expressions](dqdl.md#dqdl-syntax-rule-expressions) 섹션을 참조하세요.

**예: ID 열을 사용하여 설정된 데이터 세트 일치**

다음 예제 규칙은 두 데이터 세트를 조인하기 위해 'ID' 열을 사용하여 기본 데이터 세트 중 90%가 넘는 항목이 참조 데이터 세트와 일치하는지 확인합니다. 이 경우 모든 열을 비교합니다.

```
DatasetMatch "reference" "ID" >= 0.9
```

**예: 여러 키 열을 사용하는 설정된 데이터 세트 일치**

다음 예제에서는 기본 데이터 세트와 참조 데이터 세트의 키 열 이름이 다릅니다. `ID_1` 및 `ID_2`는 기본 데이터 세트에서 복합 키를 함께 형성합니다. `ID_ref1` 및 `ID_ref2`는 참조 데이터 세트에 복합 키를 함께 형성합니다. 이 시나리오에서는 특수 구문을 사용하여 열 이름을 제공할 수 있습니다.

```
DatasetMatch "reference" "ID_1->ID_ref1,ID_2->ID_ref2" >= 0.9
```

**예: 여러 키 열을 사용하여 설정된 데이터 세트 일치 및 특정 열이 일치하는지 확인**

이 예는 이전 예를 기반으로 구축되었습니다. 금액이 포함된 열만 일치하는지 확인하려고 합니다. 이 열의 이름은 기본 데이터 세트에서 `Amount1`이고, 참조 데이터 세트에서 `Amount2`입니다. 정확한 일치시키려고 합니다.

```
DatasetMatch "reference" "ID_1->ID_ref1,ID_2->ID_ref2" "Amount1->Amount2" >= 0.9
```

# DistinctValuesCount
<a name="dqdl-rule-types-DistinctValuesCount"></a>

지정된 표현식을 기준으로 열의 고유 값 수를 확인합니다.

**구문**

```
DistinctValuesCount <COL_NAME> <EXPRESSION>
```
+ **COL\$1NAME** - 데이터 품질 규칙을 평가할 열의 이름입니다.

  **지원되는 열 유형**: 모든 열 유형
+ **EXPRESSION** - 부울 값을 생성하기 위해 규칙 유형 응답에 대해 실행할 표현식입니다. 자세한 내용은 [Expressions](dqdl.md#dqdl-syntax-rule-expressions) 섹션을 참조하세요.

**예: 고유 열 값 개수**

다음 예제 규칙은 `State` 열에 3개 이상의 고유 값이 포함되어 있는지 확인합니다.

```
DistinctValuesCount "State" > 3
DistinctValuesCount "Customer_ID" < 6  where "Customer_ID < 10"
```

**샘플 동적 규칙**
+ `DistinctValuesCount "colA" between avg(last(10))-1 and avg(last(10))+1`
+ `DistinctValuesCount "colA" <= index(last(10),2) + std(last(5))`

# Entropy
<a name="dqdl-rule-types-Entropy"></a>

열의 **엔트로피 값이 지정된 표현식과 일치하는지 확인합니다. 엔트로피는 메시지에 포함된 정보의 수준을 측정합니다. 열의 값에 대한 확률 분포를 고려할 때 엔트로피는 값을 식별하는 데 필요한 비트 수를 설명합니다.

**구문**

```
Entropy <COL_NAME> <EXPRESSION>
```
+ **COL\$1NAME** - 데이터 품질 규칙을 평가할 열의 이름입니다.

  **지원되는 열 유형**: 모든 열 유형
+ **EXPRESSION** - 부울 값을 생성하기 위해 규칙 유형 응답에 대해 실행할 표현식입니다. 자세한 내용은 [Expressions](dqdl.md#dqdl-syntax-rule-expressions) 섹션을 참조하세요.

**예: 열 엔트로피**

다음 예제 규칙은 `Feedback` 열의 엔트로피 값이 1보다 큰지 확인합니다.

```
Entropy "Star_Rating" > 1
Entropy "First_Name" > 1  where "Customer_ID < 10"
```

 **샘플 동적 규칙** 
+ `Entropy "colA" < max(last(10))`
+ `Entropy "colA" between min(last(10)) and max(last(10))`

# IsComplete
<a name="dqdl-rule-types-IsComplete"></a>

열의 모든 값이 완전한지(null이 아님) 확인합니다.

**구문**

```
IsComplete <COL_NAME>
```
+ **COL\$1NAME** - 데이터 품질 규칙을 평가할 열의 이름입니다.

  **지원되는 열 유형**: 모든 열 유형

**예: Null 값**

다음 예에서는 `email` 열의 모든 값이 null이 아닌지 확인합니다.

```
IsComplete "email"
IsComplete "Email" where "Customer_ID between 1 and 50"
IsComplete "Customer_ID"  where "Customer_ID < 16 and Customer_ID != 12"
IsComplete "passenger_count" where "payment_type<>0"
```

**Null 동작**

 CSV 데이터 형식에 대한 참고 사항: CSV 열의 빈 행은 여러 동작을 표시할 수 있습니다.
+  열의 유형이 `String`인 경우 빈 행은 빈 문자열로 인식되어 `Completeness` 규칙에 실패하지 않습니다.
+  열이 `Int`와 같은 다른 데이터 유형인 경우 빈 행이 `NULL`로 인식되어 `Completeness` 규칙에 실패합니다.

# IsPrimaryKey
<a name="dqdl-rule-types-IsPrimaryKey"></a>

열에 기본 키가 포함되어 있는지 확인합니다. 열의 모든 값이 고유하고 완전한 경우(null이 아닌 경우) 열에 기본 키가 포함됩니다. 여러 열이 있는 프라이머리 키를 확인할 수도 있습니다.

**구문**

```
IsPrimaryKey <COL_NAME>
```
+ **COL\$1NAME** - 데이터 품질 규칙을 평가할 열의 이름입니다.

  **지원되는 열 유형**: 모든 열 유형

**예: 기본 키**

다음 예제 규칙은 `Customer_ID` 열에 기본 키가 있는지 여부를 확인합니다.

```
IsPrimaryKey "Customer_ID"
IsPrimaryKey "Customer_ID" where "Customer_ID < 10"
```

 **예: 여러 열이 있는 프라이머리 키입니다. 다음 예제는 유효합니다.**

```
IsPrimaryKey "colA" "colB"
IsPrimaryKey "colA" "colB" "colC"
IsPrimaryKey colA "colB" "colC"
```

# IsUnique
<a name="dqdl-rule-types-IsUnique"></a>

열의 모든 값이 고유한지 확인하고 부울 값을 반환합니다.

**구문**

```
IsUnique <COL_NAME>
```
+ **COL\$1NAME** - 데이터 품질 규칙을 평가할 열의 이름입니다.

  **지원되는 열 유형**: 모든 열 유형

**예시**

다음 예제 규칙은 `email` 열의 모든 값이 고유한지 확인합니다.

```
IsUnique "email"
IsUnique "Customer_ID" where "Customer_ID < 10"]
```

다음 예제 규칙은 여러 열을 확인합니다.

```
IsUnique "vendorid" "tpep_pickup_datetime"
```

# Mean
<a name="dqdl-rule-types-Mean"></a>

열에 있는 모든 값의 평균이 지정된 표현식과 일치하는지 확인합니다.

**구문**

```
Mean <COL_NAME> <EXPRESSION>
```
+ **COL\$1NAME** - 데이터 품질 규칙을 평가할 열의 이름입니다.

  **지원되는 열 유형**: Byte, Decimal, Double, Float, Integer, Long, Short
+ **EXPRESSION** - 부울 값을 생성하기 위해 규칙 유형 응답에 대해 실행할 표현식입니다. 자세한 내용은 [Expressions](dqdl.md#dqdl-syntax-rule-expressions) 섹션을 참조하세요.

**예: 평균값**

다음 예제 규칙은 열에 있는 모든 값의 평균이 임곗값을 초과하는지 여부를 확인합니다.

```
Mean "Star_Rating" > 3
Mean "Salary" < 6200 where "Customer_ID < 10"
```

 **샘플 동적 규칙** 
+ `Mean "colA" > avg(last(10)) + std(last(2))`
+ `Mean "colA" between min(last(5)) - 1 and max(last(5)) + 1`

**Null 동작**

 `Mean` 규칙은 평균을 계산할 때 `NULL` 값이 있는 행을 무시합니다. 예: 

```
+---+-----------+
|id |units      |
+---+-----------+
|100|0          |
|101|null       |
|102|20         |
|103|null       |
|104|40         |
+---+-----------+
```

 `units`열의 평균은 (0 \$1 20 \$1 40)/3 = 20이 됩니다. 101행과 103행은 이 계산에서 고려되지 않습니다.

# ReferentialIntegrity
<a name="dqdl-rule-types-ReferentialIntegrity"></a>

기본 데이터 세트의 열 세트 값이 어느 범위까지 참조 데이터 세트의 열 세트 값에 대한 하위 세트인지를 확인합니다.

**구문**

```
ReferentialIntegrity <PRIMARY_COLS> <REFERENCE_DATASET_COLS> <EXPRESSION>
```
+ **PRIMARY\$1COLS** - 기본 데이터 세트의 쉼표로 구분된 열 이름 목록입니다.

  **지원되는 열 유형**: Byte, Decimal, Double, Float, Integer, Long, Short
+ **REFERENCE\$1DATASET\$1COLS** - 이 파라미터는 마침표로 구분된 두 부분을 포함합니다. 첫 번째 부분은 참조 데이터 세트의 별칭입니다. 두 번째 부분은 참조 데이터 세트에서 괄호로 묶인 쉼표로 구분된 열 이름 목록입니다.

  **지원되는 열 유형**: Byte, Decimal, Double, Float, Integer, Long, Short
+ **EXPRESSION** - 부울 값을 생성하기 위해 규칙 유형 응답에 대해 실행할 표현식입니다. 자세한 내용은 [Expressions](dqdl.md#dqdl-syntax-rule-expressions) 섹션을 참조하세요.

**예: zip code 열의 참조 무결성 확인**

다음 예제 규칙은 기본 데이터 세트의 `zipcode` 열에 있는 값 중 90%가 넘는 항목이 `reference` 데이터 세트의 `zipcode` 열에 있는지 확인합니다.

```
ReferentialIntegrity "zipcode" "reference.zipcode" >= 0.9
```

**예: city 및 state 열의 참조 무결성 확인**

다음 예제에서는 city 및 state 정보가 포함된 열이 기본 데이터 세트과 참조 데이터 세트에 있습니다. 두 데이터 세트의 열 이름은 서로 다릅니다. 이 규칙은 기본 데이터 세트의 열 값 세트가 참조 데이터 세트의 열 값 세트와 정확히 같은지 확인합니다.

```
ReferentialIntegrity "city,state" "reference.{ref_city,ref_state}" = 1.0
```

 **샘플 동적 규칙** 
+ `ReferentialIntegrity "city,state" "reference.{ref_city,ref_state}" > avg(last(10))`
+ `ReferentialIntegrity "city,state" "reference.{ref_city,ref_state}" between min(last(10)) - 1 and max(last(10)) + 1`

# RowCount
<a name="dqdl-rule-types-RowCount"></a>

지정된 표현식을 기준으로 데이터 세트의 행 수를 확인합니다. 표현식에서 `>` 및 `<` 같은 연산자를 사용하여 행 수 또는 행 범위를 지정할 수 있습니다.

**구문**

```
RowCount <EXPRESSION>
```
+ **EXPRESSION** - 부울 값을 생성하기 위해 규칙 유형 응답에 대해 실행할 표현식입니다. 자세한 내용은 [Expressions](dqdl.md#dqdl-syntax-rule-expressions) 섹션을 참조하세요.

**예: 행 수 수치 검사**

다음 예제 규칙은 행 수가 지정된 범위 내에 있는지 확인합니다.

```
RowCount between 10 and 100
RowCount between 1 and 50 where "Customer_ID < 10"
```

 **샘플 동적 규칙** 

```
RowCount > avg(last(10)) *0.8
```

# RowCountMatch
<a name="dqdl-rule-types-RowCountMatch"></a>

주어진 표현식과 비교하여 기본 데이터 세트의 행 수와 참조 데이터 세트의 행 수 비율을 확인합니다.

**구문**

```
RowCountMatch <REFERENCE_DATASET_ALIAS> <EXPRESSION>
```
+ **REFERENCE\$1DATASET\$1ALIAS** - 행 수를 비교할 참조 데이터 세트의 별칭입니다.

  **지원되는 열 유형**: Byte, Decimal, Double, Float, Integer, Long, Short
+ **EXPRESSION** - 부울 값을 생성하기 위해 규칙 유형 응답에 대해 실행할 표현식입니다. 자세한 내용은 [Expressions](dqdl.md#dqdl-syntax-rule-expressions) 섹션을 참조하세요.

**예: 참조 데이터 세트를 기준으로 행 수 확인**

다음 예제 규칙은 기본 데이터 세트의 행 수가 참조 데이터 세트 행 수의 90% 이상인지 확인합니다.

```
RowCountMatch "reference" >= 0.9
```

# StandardDeviation
<a name="dqdl-rule-types-StandardDeviation"></a>

지정된 표현식을 기준으로 열에 있는 모든 값의 표준 편차를 검사합니다.

**구문**

```
StandardDeviation <COL_NAME> <EXPRESSION>
```
+ **COL\$1NAME** - 데이터 품질 규칙을 평가할 열의 이름입니다.

  **지원되는 열 유형**: Byte, Decimal, Double, Float, Integer, Long, Short
+ **EXPRESSION** - 부울 값을 생성하기 위해 규칙 유형 응답에 대해 실행할 표현식입니다. 자세한 내용은 [Expressions](dqdl.md#dqdl-syntax-rule-expressions) 섹션을 참조하세요.

**예: 표준 편차**

다음 예제 규칙은 `colA` 열에 있는 값의 표준 편차가 지정된 값보다 작은지 여부를 확인합니다.

```
StandardDeviation "Star_Rating" < 1.5
StandardDeviation "Salary" < 3500 where "Customer_ID < 10"
```

 **샘플 동적 규칙** 
+ `StandardDeviation "colA" > avg(last(10) + 0.1`
+ `StandardDeviation "colA" between min(last(10)) - 1 and max(last(10)) + 1`

**Null 동작**

 `StandardDeviation` 규칙은 표준 편차를 계산할 때 `NULL` 값이 있는 행을 무시합니다. 예: 

```
+---+-----------+-----------+
|id |units1     |units2     |
+---+-----------+-----------+
|100|0          |0          |
|101|null       |0          |
|102|20         |20         |
|103|null       |0          |
|104|40         |40         |
+---+-----------+-----------+
```

 `units1` 열의 표준 편차는 101열과 103열을 고려하지 않고 16.33으로 계산됩니다. `units2` 열의 표준 편차는 16이 됩니다.

# Sum
<a name="dqdl-rule-types-Sum"></a>

지정된 표현식을 기준으로 열에 있는 모든 값의 합계를 확인합니다.

**구문**

```
Sum <COL_NAME> <EXPRESSION>
```
+ **COL\$1NAME** - 데이터 품질 규칙을 평가할 열의 이름입니다.

  **지원되는 열 유형**: Byte, Decimal, Double, Float, Integer, Long, Short
+ **EXPRESSION** - 부울 값을 생성하기 위해 규칙 유형 응답에 대해 실행할 표현식입니다. 자세한 내용은 [Expressions](dqdl.md#dqdl-syntax-rule-expressions) 섹션을 참조하세요.

**예: 합계**

다음 예제 규칙은 열에 있는 모든 값의 합계가 지정된 임곗값을 초과하는지 여부를 확인합니다.

```
Sum "transaction_total" > 500000
Sum "Salary" < 55600 where "Customer_ID < 10"
```

 **샘플 동적 규칙** 
+ `Sum "ColA" > avg(last(10))`
+ `Sum "colA" between min(last(10)) - 1 and max(last(10)) + 1`

**Null 동작**

 `Sum` 규칙은 합계를 계산할 때 `NULL` 값이 있는 행을 무시합니다. 예: 

```
+---+-----------+
|id |units      |
+---+-----------+
|100|0          |
|101|null       |
|102|20         |
|103|null       |
|104|40         |
+---+-----------+
```

 `units` 열의 합계는 101열과 103열을 고려하지 않고 (0 \$1 20 \$1 40) = 60으로 계산됩니다.

# SchemaMatch
<a name="dqdl-rule-types-SchemaMatch"></a>

기본 데이터 세트의 스키마가 참조 데이터 세트의 스키마와 일치하는지 확인합니다. 스키마 검사는 열 단위로 수행됩니다. 이름이 동일하고 유형이 동일하면 두 열의 스키마가 일치합니다. 열 순서는 중요하지 않습니다.

**구문**

```
SchemaMatch <REFERENCE_DATASET_ALIAS> <EXPRESSION>
```
+ **REFERENCE\$1DATASET\$1ALIAS** - 스키마를 비교할 때 사용할 참조 데이터 세트의 별칭입니다.

  **지원되는 열 유형**: Byte, Decimal, Double, Float, Integer, Long, Short
+ **EXPRESSION** - 부울 값을 생성하기 위해 규칙 유형 응답에 대해 실행할 표현식입니다. 자세한 내용은 [Expressions](dqdl.md#dqdl-syntax-rule-expressions) 섹션을 참조하세요.

**예: SchemaMatch**

다음 예제 규칙은 기본 데이터 세트의 스키마가 참조 데이터 세트의 스키마와 정확히 일치하는지 확인합니다.

```
SchemaMatch "reference" = 1.0
```

# Uniqueness
<a name="dqdl-rule-types-Uniqueness"></a>

지정된 표현식을 기준으로 열에서 고유한 값의 백분율을 검사합니다. 고유한 값은 정확히 한 번 발생합니다.

**구문**

```
Uniqueness <COL_NAME> <EXPRESSION>
```
+ **COL\$1NAME** - 데이터 품질 규칙을 평가할 열의 이름입니다.

  **지원되는 열 유형**: 모든 열 유형
+ **EXPRESSION** - 부울 값을 생성하기 위해 규칙 유형 응답에 대해 실행할 표현식입니다. 자세한 내용은 [Expressions](dqdl.md#dqdl-syntax-rule-expressions) 섹션을 참조하세요.

**예제**

다음 예제 규칙은 열의 고유 값 백분율이 특정 숫자 기준과 일치하는지 여부를 확인합니다.

```
Uniqueness "email" = 1.0
Uniqueness "Customer_ID" != 1.0 where "Customer_ID < 10"
```

다음 예제 규칙은 여러 열을 확인합니다.

```
Uniqueness "vendorid" "tpep_pickup_datetime" = 1
```

 **샘플 동적 규칙** 
+ `Uniqueness "colA" between min(last(10)) and max(last(10))`
+ `Uniqueness "colA" >= avg(last(10))`

# UniqueValueRatio
<a name="dqdl-rule-types-UniqueValueRatio"></a>

지정된 표현식을 기준으로 열의 **고유 값 비율을 검사합니다. 고유 값 비율은 고유 값의 비율을 열에 있는 모든 고유 값의 수로 나눈 값입니다. 고유 값은 정확히 한 번 나타나는 반면 개별 값은 한 번 **이상 나타납니다.

예를 들어 `[a, a, b]` 세트에는 고유 값 1개(`b`)와 개별 값 2개(`a` 및 `b`)가 포함됩니다. 따라서 세트의 고유 값 비율은 ½ = 0.5입니다.

**구문**

```
UniqueValueRatio <COL_NAME> <EXPRESSION>
```
+ **COL\$1NAME** - 데이터 품질 규칙을 평가할 열의 이름입니다.

  **지원되는 열 유형**: 모든 열 유형
+ **EXPRESSION** - 부울 값을 생성하기 위해 규칙 유형 응답에 대해 실행할 표현식입니다. 자세한 내용은 [Expressions](dqdl.md#dqdl-syntax-rule-expressions) 섹션을 참조하세요.

**예: 고유 값 비율**

이 예에서는 열의 고유 값 비율을 값 범위와 비교하여 확인합니다.

```
UniqueValueRatio "test_score" between 0 and 0.5
UniqueValueRatio "Customer_ID" between 0 and 0.9 where "Customer_ID < 10"
```

 **샘플 동적 규칙** 
+ `UniqueValueRatio "colA" > avg(last(10))`
+ `UniqueValueRatio "colA" <= index(last(10),2) + std(last(5))`

# DetectAnomalies
<a name="dqdl-rule-types-DetectAnomalies"></a>

 지정된 데이터 품질 규칙의 이상을 탐지합니다. DetectAnomalies 규칙을 실행할 때마다 지정된 규칙에 대한 평가 값이 저장됩니다. 수집된 데이터가 충분하면 이상 탐지 알고리즘이 해당 규칙에 대한 모든 기록 데이터를 가져와서 이상 탐지를 실행합니다. 이상이 탐지되면 DetectAnomalies 규칙이 실패합니다. 어떤 이상이 탐지되었는지에 대한 자세한 정보는 관찰에서 확인할 수 있습니다.

**구문**

```
       DetectAnomalies <RULE_NAME> <RULE_PARAMETERS>
```

 `RULE_NAME` - 이상을 평가하고 탐지하려는 규칙의 이름입니다. 지원되는 규칙: 
+ "RowCount"
+ "Completeness"
+ "Uniqueness"
+ "Mean"
+ "Sum"
+ "StandardDeviation"
+ "Entropy"
+ "DistinctValuesCount"
+ "UniqueValueRatio"
+ "ColumnLength"
+ "ColumnValues"
+ "ColumnCorrelation"
+ "CustomSQL"
+ "ColumnCount"

 `RULE_PARAMETERS` - 일부 규칙을 실행하려면 추가 파라미터가 필요합니다. 필수 파라미터를 확인하려면 해당 규칙 설명서를 참조하세요.

**예: RowCount에 대한 이상 항목**

예를 들어 RowCount 이상을 탐지하려면 RowCount를 규칙 이름으로 입력합니다.

```
DetectAnomalies "RowCount"
```

**예: ColumnLength에 대한 이상 항목**

예를 들어 ColumnLength 이상을 탐지하려면 규칙 이름으로 ColumnLength와 열 이름을 입력합니다.

```
DetectAnomalies "ColumnLength" "id"
```

# FileFreshness
<a name="dqdl-rule-types-FileFreshness"></a>

 FileFreshness를 사용하면 사용자가 제공한 조건에 따라 데이터 파일을 새로 고칩니다. 파일의 마지막 수정 시간을 사용하여 데이터 파일 또는 전체 폴더가 최신 상태인지 확인합니다.

 이 규칙은 두 가지 지표를 수집합니다.
+ 설정한 규칙에 따른 FileFreshness 규정 준수
+ 규칙에 따라 스캔된 파일 수

```
{"Dataset.*.FileFreshness.Compliance":1,"Dataset.*.FileCount":1} 
```

 이상 탐지에서는 이러한 지표를 고려하지 않습니다.

 **파일 최신성 확인** 

 다음 규칙은 tickets.parquet가 지난 24시간 동안 생성되도록 보장합니다.

```
FileFreshness "s3://amzn-s3-demo-bucket/artifacts/file/tickets/tickets.parquet" > (now() - 24 hours)
```

 **폴더 최신성 확인** 

 다음 규칙은 폴더의 모든 파일이 지난 24시간 이내에 생성되거나 수정된 경우 통과됩니다.

```
FileFreshness "s3://bucket/" >= (now() -1 days)
FileFreshness "s3://amzn-s3-demo-bucket/artifacts/file/tickets/" >= (now() - 24 hours)
```

 **임계치를 사용하여 폴더 또는 파일 최신성 확인** 

 다음 규칙은 지난 10일 동안 "tickets" 폴더에 있는 파일의 10%가 생성되거나 수정된 경우 통과됩니다.

```
FileFreshness "s3://amzn-s3-demo-bucket/artifacts/file/tickets/" < (now() - 10 days) with threshold > 0.1
```

 **특정 날짜의 파일 또는 폴더 확인** 

 특정 날짜의 파일 최신성을 확인할 수 있습니다.

```
FileFreshness "s3://amzn-s3-demo-bucket/artifacts/file/tickets/" > "2020-01-01"
FileFreshness "s3://amzn-s3-demo-bucket/artifacts/file/tickets/" between "2023-01-01" and "2024-01-01"
```

 **시간 제한하여 파일 또는 폴더 확인** 

 FileFreshness를 사용하여 특정 시간에 따라 파일이 도착했는지 확인할 수 있습니다.

```
FileFreshness "s3://amzn-s3-demo-bucket/artifacts/file/tickets/" between now() and (now() - 45 minutes)
FileFreshness "s3://amzn-s3-demo-bucket/artifacts/file/tickets/" between "9:30 AM" and "9:30 PM"
FileFreshness "s3://amzn-s3-demo-bucket/artifacts/file/tickets/" > (now() - 10 minutes)
FileFreshness "s3://amzn-s3-demo-bucket/artifacts/file/tickets/" > now()
FileFreshness "s3://amzn-s3-demo-bucket/artifacts/file/tickets/" between (now() - 2 hours) and (now() + 15 minutes)
FileFreshness "s3://amzn-s3-demo-bucket/artifacts/file/tickets/" between (now() - 3 days) and (now() + 15 minutes)
FileFreshness "s3://amzn-s3-demo-bucket/artifacts/file/tickets/" between "2001-02-07" and (now() + 15 minutes)
FileFreshness "s3://amzn-s3-demo-bucket/artifacts/file/tickets/" > "21:45""
FileFreshness "s3://amzn-s3-demo-bucket/artifacts/file/tickets/" > "2024-01-01"
FileFreshness "s3://amzn-s3-demo-bucket/artifacts/file/tickets/" between "02:30" and "04:30"
FileFreshness "s3://amzn-s3-demo-bucket/artifacts/file/tickets/" between "9:30 AM" and "22:15"
```

 주요 고려 사항: 
+  FileFreshness는 일, 시간 및 분 단위를 사용하여 파일을 평가할 수 있습니다.
+  경우에 따라 오전/오후 및 24시간을 지원합니다.
+  재정의가 지정되지 않는 한 시간은 UTC로 계산됩니다.
+  날짜는 00:00 시간의 UTC로 계산됩니다.

 시간 기반 FileFreshness는 다음과 같이 작동합니다.

```
FileFreshness "s3://amzn-s3-demo-bucket/artifacts/file/tickets/" > "21:45"
```
+  먼저 시간 “21:45”를 UTC 형식의 오늘 날짜와 결합하여 날짜-시간 필드를 생성합니다.
+  다음으로 날짜-시간이 지정한 시간대로 변환됩니다.
+  마지막으로 규칙이 평가됩니다.

 **선택적 파일 기반 규칙 태그:** 

 태그를 사용하면 규칙 동작을 제어할 수 있습니다.

 **recentFiles** 

 이 태그는 가장 최근 파일을 먼저 유지하여 처리되는 파일 수를 제한합니다.

```
FileFreshness "s3://amzn-s3-demo-bucket/" between (now() - 100 minutes) and (now() + 10 minutes) with recentFiles = 1
```

 **uriRegex** 

**참고**  
 `uriRegex` 태그는 AWS Glue 5.0 이상에서 사용할 수 있습니다.

 이 태그는 파일 경로에 정규식 패턴을 적용하여 파일을 필터링합니다. 경로가 패턴과 일치하는 파일만 처리됩니다. 부정적 예측을 사용하여 패턴과 일치하는 파일을 제외할 수도 있습니다.

```
# Match only files with a .csv extension
FileFreshness "s3://amzn-s3-demo-bucket/" > (now() - 24 hours) with uriRegex = "\.csv$"
# Match Parquet files that contain "orders_" in the path
FileFreshness "s3://amzn-s3-demo-bucket/" > (now() - 24 hours) with uriRegex = ".*orders_.*\.parquet"
# Exclude files ending in .tmp using a negative lookahead
FileFreshness "s3://amzn-s3-demo-bucket/" > (now() - 24 hours) with uriRegex = "(?!.*\.tmp$).*"
```

 **filterOrder** 

**참고**  
 `filterOrder` 태그는 AWS Glue 5.0 이상에서 사용할 수 있습니다.

 `recentFiles` 및 `uriRegex`와 같은 여러 필터 태그를 함께 사용하면 `filterOrder` 태그가 해당 태그의 적용 순서를 제어합니다. 기본 순서는 `recentFiles` 먼저, 그 다음에 `uriRegex`입니다.

```
FileFreshness "s3://amzn-s3-demo-bucket/" > (now() - 24 hours) with recentFiles = 1 with uriRegex = "inventory_" with filterOrder = ["uriRegex","recentFiles"]
```

 위 예제에서 `uriRegex` 필터는 먼저 'inventory\$1'와 일치하는 파일만 선택하고 `recentFiles = 1`에서 필터링된 세트에서 최근 파일을 가져옵니다. `filterOrder`가 없으면 기본 동작은 하나의 최근 파일을 먼저 가져온 다음 정규식을 적용합니다. 이 경우 최근 파일이 패턴과 일치하지 않으면 일치하는 파일이 없을 수 있습니다.

**참고**  
 `filterOrder` 목록의 모든 값은 동일한 규칙에도 있는 다른 필터 태그(`recentFiles` 또는 `uriRegex`)를 참조해야 합니다. `timeZone` 또는 `failFast`와 같은 비필터 태그는 `filterOrder`에서 유효하지 않습니다.

 **failFast** 

 `"true"`로 설정하면 규칙은 모든 파일을 평가하고 규정 준수 비율을 계산하는 대신 최신성 조건에 통과하지 못한 첫 번째 파일에서 즉시 실패를 반환합니다.

```
FileFreshness "s3://amzn-s3-demo-bucket/" > (now() - 24 hours) with failFast = "true"
```

 **timeZone** 

 허용되는 시간대 재정의는 지원되는 시간대에 [Allowed Time Zones](https://docs.oracle.com/javase/8/docs/api/java/time/ZoneId.html)를 참조하세요.

```
FileFreshness "s3://path/" > "21:45" with timeZone = "America/New_York"
```

```
FileFreshness "s3://path/" > "21:45" with timeZone = "America/Chicago"
```

```
FileFreshness "s3://path/" > "21:45" with timeZone = "Europe/Paris"
```

```
FileFreshness "s3://path/" > "21:45" with timeZone = "Asia/Shanghai"
```

```
FileFreshness "s3://path/" > "21:45" with timeZone = "Australia/Darwin"
```

 **데이터 프레임에서 직접 파일 이름 추론** 

 항상 파일 경로를 제공하지 않아도 됩니다. 예를 들어 AWS Glue Data Catalog에서 규칙을 작성할 때 카탈로그 테이블에서 사용 중인 폴더를 찾기 어려울 수 있습니다. AWS Glue Data Quality에서는 데이터 프레임을 채우는 데 사용되는 특정 폴더나 파일을 찾고 해당 항목이 최신 상태인지를 감지할 수 있습니다.

**참고**  
 이 기능은 파일이 DynamicFrame 또는 DataFrame으로 성공적으로 읽기된 경우에만 작동합니다.

```
FileFreshness > (now() - 24 hours)
```

 이 규칙은 동적 프레임 또는 데이터 프레임을 채우는 데 사용되는 폴더 경로나 파일을 찾습니다. Amazon S3 경로 또는 Amazon S3 기반 AWS Glue Data Catalog 테이블에 대해 사용할 수 있습니다. 이때 몇 가지 고려 사항이 있습니다.

1.  AWS Glue ETL에서 Amazon S3 또는 AWS Glue Data Catalog 변환 직후 **EvaluateDataQuality** 변환이 있어야 합니다.  
![\[스크린샷에서는 Amazon S3 노드에 연결된 데이터 품질 평가 노드를 보여줍니다.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/data-quality-file-freshness.png)

1.  이 규칙은 AWS Glue 대화형 세션에서 작동하지 않습니다.

 두 경우 모두에서 시도하거나 AWS Glue에서 파일을 찾을 수 없는 경우 AWS Glue에서 다음 오류가 발생합니다. `“Unable to parse file path from DataFrame”` 

# FileMatch
<a name="dqdl-rule-types-FileMatch"></a>

 FileMatch 규칙을 사용하면 파일을 다른 파일 또는 체크섬과 비교할 수 있습니다. 이는 다음과 같은 몇 가지 시나리오에서 유용할 수 있습니다.

1.  외부 소스에서 수신한 파일 검증: FileMatch를 사용하여 체크섬과 비교해 외부 소스에서 올바른 파일을 수신하도록 보장할 수 있습니다. 이 방식으로 수집 중인 데이터의 무결성을 검증할 수 있습니다.

1.  서로 다른 두 폴더의 데이터 비교: FileMatch를 사용하여 두 폴더 간의 파일을 비교할 수 있습니다.

 이 규칙은 규칙에 따라 스캔한 파일 수라는 하나의 지표를 수집합니다.

```
{"Dataset.*.FileCount":1}
```

 **체크섬으로 파일 검증:** 

 FileMatch는 파일과 설정된 체크섬을 수락하여 하나 이상의 체크섬이 파일과 일치하는지 확인합니다.

```
FileMatch "s3://amzn-s3-demo-bucket/file.json" in ["3ee0d8617ac041793154713e5ef8f319"] with hashAlgorithm = "MD5"
FileMatch "s3://amzn-s3-demo-bucket/file.json" in ["3ee0d8617ac041793154713e5ef8f319"] with hashAlgorithm = "SHA-1"
FileMatch "s3://amzn-s3-demo-bucket/file.json" in ["3ee0d8617ac041793154713e5ef8f319"] with hashAlgorithm = "SHA-256"
FileMatch "s3://amzn-s3-demo-bucket/file.json" in ["3ee0d8617ac041793154713e5ef8f319"]
```

 다음 표준 알고리즘이 지원됩니다.
+ MD5
+ SHA-1
+ SHA-256

 알고리즘을 제공하지 않으면 기본값은 SHA-256입니다.

 **체크섬 세트로 폴더의 모든 파일 검증:** 

```
FileMatch "s3://amzn-s3-demo-bucket /" in ["3ee0d8617ac041793154713e5ef8f319", "7e8617ac041793154713e5ef8f319"] with hashAlgorithm = "MD5"
FileMatch "s3://amzn-s3-demo-bucket /internal-folder/" in ["3ee0d8617ac041793154713e5ef8f319", "7e8617ac041793154713e5ef8f319"]
```

 **다른 폴더의 파일 비교** 

```
# Compare all files across two buckets
FileMatch "s3://original_bucket/" "s3://archive_bucket/"
# Compare files within specific subfolders
FileMatch "s3://original_bucket/internal-folder/" "s3://original_bucket/other-folder/"
# Compare only .json files across two folders
FileMatch "s3://original_bucket/" "s3://archive_bucket/" with uriRegex = "\.json$"
# Compare only the 5 most recent .csv files
FileMatch "s3://original_bucket/" "s3://archive_bucket/" with recentFiles = 5 with uriRegex = "\.csv$" with filterOrder = ["uriRegex","recentFiles"]
```

 FileMatch는 `original_bucket`에서 파일 콘텐츠를 확인하고 `archive_bucket`의 내용과 일치하는지 확인합니다. 정확히 일치하지 않으면 규칙은 실패합니다. 내부 폴더 또는 개별 파일의 콘텐츠를 확인할 수도 있습니다.

 FileMatch는 개별 파일을 서로 비교하여 확인할 수도 있습니다.

```
FileMatch "s3://amzn-s3-demo-bucket /file_old.json" "s3://amzn-s3-demo-bucket /file_new.json"
```

 **데이터 프레임에서 직접 파일 이름 추론** 

 항상 파일 경로를 제공하지 않아도 됩니다. 예를 들어 AWS Glue Data Catalog(Amazon S3 지원)에서 규칙을 작성하는 경우 카탈로그 테이블에서 사용 중인 폴더를 찾기 어려울 수 있습니다. AWS Glue Data Quality에서는 데이터 프레임을 채우는 데 사용되는 특정 폴더나 파일을 찾을 수 있습니다.

**참고**  
 이 기능은 파일이 DynamicFrame 또는 DataFrame으로 성공적으로 읽기된 경우에만 작동합니다.

```
FileMatch in ["3ee0d8617ac041793154713e5ef8f319"] with hashAlgorithm = "MD5"
FileMatch in ["3ee0d8617ac041793154713e5ef8f319"] with hashAlgorithm = "SHA-1"
FileMatch in ["3ee0d8617ac041793154713e5ef8f319"] with hashAlgorithm = "SHA-256"
FileMatch in ["3ee0d8617ac041793154713e5ef8f319"]
```

 제공된 체크섬이 계산된 체크섬과 다른 경우 FileMatch는 차이를 알립니다.

![\[스크린샷에서는 규칙의 DQ 상태가 실패인 규칙을 보여줍니다. FileMatch에서는 실패를 설명합니다.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/data-quality-file-match.png)


 **선택적 파일 기반 규칙 태그:** 

 태그를 사용하면 규칙 동작을 제어할 수 있습니다.

 **recentFiles** 

 이 태그는 가장 최근 파일을 먼저 유지하여 처리되는 파일 수를 제한합니다.

```
FileMatch "s3://bucket/" in ["3ee0d8617ac04179sam4713e5ef8f319"] with recentFiles = 1
```

 **uriRegex** 

**참고**  
 `uriRegex` 태그는 AWS Glue 5.0 이상에서 사용할 수 있습니다.

 이 태그는 파일 경로에 정규식 패턴을 적용하여 파일을 필터링합니다. 경로가 패턴과 일치하는 파일만 처리됩니다. 부정적 예측을 사용하여 패턴과 일치하는 파일을 제외할 수도 있습니다.

```
# Match only files with a .json extension
FileMatch "s3://bucket/" in ["3ee0d8617ac04179sam4713e5ef8f319"] with uriRegex = "\.json$"
# Exclude files ending in .tmp using a negative lookahead
FileMatch "s3://bucket/" in ["3ee0d8617ac04179sam4713e5ef8f319"] with uriRegex = "(?!.*\.tmp$).*"
```

 **filterOrder** 

**참고**  
 `filterOrder` 태그는 AWS Glue 5.0 이상에서 사용할 수 있습니다.

 `recentFiles` 및 `uriRegex`와 같은 여러 필터 태그를 함께 사용하면 `filterOrder` 태그가 해당 태그의 적용 순서를 제어합니다. 기본 순서는 `recentFiles` 먼저, 그 다음에 `uriRegex`입니다.

```
FileMatch "s3://bucket/" in ["3ee0d8617ac04179sam4713e5ef8f319"] with recentFiles = 1 with uriRegex = "\.json$" with filterOrder = ["uriRegex","recentFiles"]
```

 **matchFileName** 

 이 태그는 파일의 이름이 중복되지 않게 합니다. 기본 동작은 false입니다.

```
FileMatch "s3://amzn-s3-demo-bucket/file.json" in ["3ee0d8617ac04179sam4713e5ef8f319"] with matchFileName = "true"
```

 이때 몇 가지 고려 사항이 있습니다.

1.  AWS Glue ETL에서 Amazon S3 또는 AWS Glue Data Catalog 변환 직후 **EvaluateDataQuality** 변환이 있어야 합니다.  
![\[스크린샷에서는 규칙의 DQ 상태가 실패인 규칙을 보여줍니다. FileMatch에서는 실패를 설명합니다.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/data-quality-file-match-transform.png)

1.  이 규칙은 AWS Glue 대화형 세션에서 작동하지 않습니다.

# FileUniqueness
<a name="dqdl-rule-types-FileUniqueness"></a>

 파일 고유성을 사용하면 데이터 생산자로부터 수신한 데이터에 중복 파일이 없는지 확인할 수 있습니다.

 다음 데이터 통계를 수집합니다.

1.  규칙에 따라 스캔된 파일 수 

1.  파일의 고유성 비율 

```
Dataset.*.FileUniquenessRatio: 1.00, Dataset.*.FileCount: 8.00
```

 **폴더에서 중복 파일 찾기:** 

```
FileUniqueness "s3://bucket/" > 0.5
FileUniqueness "s3://bucket/folder/" = 1
```

 **데이터 프레임에서 직접 폴더 이름을 추론하여 중복 감지:** 

 항상 파일 경로를 제공하지 않아도 됩니다. 예를 들어 AWS Glue Data Catalog에서 규칙을 작성할 때 카탈로그 테이블에서 사용 중인 폴더를 찾기 어려울 수 있습니다. AWS Glue Data Quality에서는 데이터 프레임을 채우는 데 사용되는 특정 폴더나 파일을 찾을 수 있습니다.

**참고**  
 추론을 사용하는 경우 파일 기반 규칙은 DynamicFrame 또는 DataFrame으로 성공적으로 읽은 파일만 감지할 수 있습니다.

```
FileUniqueness > 0.5
```

 **선택적 파일 기반 규칙 태그:** 

 태그를 사용하면 규칙 동작을 제어할 수 있습니다.

 **recentFiles** 

 이 태그는 가장 최근 파일을 먼저 유지하여 처리되는 파일 수를 제한합니다.

```
FileUniqueness "s3://amzn-s3-demo-bucket/" > 0.5 with recentFiles = 1
```

 **uriRegex** 

**참고**  
 `uriRegex` 태그는 AWS Glue 5.0 이상에서 사용할 수 있습니다.

 이 태그는 파일 경로에 정규식 패턴을 적용하여 파일을 필터링합니다. 경로가 패턴과 일치하는 파일만 처리됩니다. 부정적 예측을 사용하여 패턴과 일치하는 파일을 제외할 수도 있습니다.

```
# Match only files with a .csv extension
FileUniqueness "s3://bucket/" > 0.5 with uriRegex = "\.csv$"
# Exclude files ending in .tmp using a negative lookahead
FileUniqueness "s3://bucket/" > 0.5 with uriRegex = "(?!.*\.tmp$).*"
```

 **filterOrder** 

**참고**  
 `filterOrder` 태그는 AWS Glue 5.0 이상에서 사용할 수 있습니다.

 `recentFiles` 및 `uriRegex`와 같은 여러 필터 태그를 함께 사용하면 `filterOrder` 태그가 해당 태그의 적용 순서를 제어합니다. 기본 순서는 `recentFiles` 먼저, 그 다음에 `uriRegex`입니다.

```
FileUniqueness "s3://bucket/" > 0.5 with recentFiles = 5 with uriRegex = "\.csv$" with filterOrder = ["uriRegex","recentFiles"]
```

 **matchFileName** 

 이 태그는 파일의 이름이 중복되지 않게 합니다. 기본 동작은 false입니다.

```
FileUniqueness "s3://amzn-s3-demo-bucket/" > 0.5 with matchFileName = "true"
```

 이때 몇 가지 고려 사항이 있습니다.

1.  AWS Glue ETL에서 Amazon S3 또는 AWS Glue Data Catalog 변환 직후 **EvaluateDataQuality** 변환이 있어야 합니다.

1.  이 규칙은 AWS Glue 대화형 세션에서 작동하지 않습니다.

# FileSize
<a name="dqdl-rule-types-FileSize"></a>

 FileSize 규칙 유형을 사용하면 파일이 특정 파일 크기 기준을 충족하는지 확인할 수 있습니다. 다음 사용 사례에 유용합니다.

1.  생산자가 처리를 위해 빈 파일이나 상당히 작은 파일을 전송하지 않는지 확인합니다.

1.  대상 버킷에 성능 문제로 이어질 수 있는 더 작은 파일이 없는지 확인합니다.

 FileSize는 다음 지표를 수집합니다.

1.  규정 준수: 설정한 규칙 임계치를 충족하는 파일의 비율(%) 반환 

1.  파일 수: 규칙에 따라 스캔된 파일 수 

1.  최소 파일 크기(바이트) 

1.  최대 파일 크기(바이트) 

```
Dataset.*.FileSize.Compliance: 1.00, 
Dataset.*.FileCount: 8.00, 
Dataset.*.MaximumFileSize: 327413121.00, 
Dataset.*.MinimumFileSize: 204558920.00
```

 이러한 지표에 대해서는 이상 탐지가 지원되지 않습니다.

 **파일 크기 검증** 

 file.dat가 2MB를 초과하면 이 규칙이 통과됩니다.

```
FileSize "s3://amzn-s3-demo-bucket/file.dat" > 2 MB
```

 지원되는 단위에는 B(바이트), MB(메가 바이트), GB(기가 바이트) 및 TB(테라 바이트)가 포함됩니다.

 **폴더에서 파일 크기 검증** 

```
FileSize "s3://bucket/" > 5 B
FileSize "s3://bucket/" < 2 GB
```

 s3://amzn-s3-demo-bucket의 파일 중 70%가 2GB\$11TB인 경우 이 규칙을 통과합니다.

```
FileSize "s3://amzn-s3-demo-bucket/" between 2 GB and 1 TB  with threshold > 0.7
```

 **데이터 프레임에서 직접 파일 이름 추론** 

 항상 파일 경로를 제공하지 않아도 됩니다. 예를 들어 Data Catalog에서 규칙을 작성할 때 카탈로그 테이블에서 사용 중인 폴더를 찾기 어려울 수 있습니다. AWS Glue Data Quality에서는 데이터 프레임을 채우는 데 사용되는 특정 폴더나 파일을 찾을 수 있습니다.

**참고**  
 이 기능은 파일이 DynamicFrame 또는 DataFrame으로 성공적으로 읽기된 경우에만 작동합니다.

```
FileSize < 10 MB with threshold > 0.7
```

 **선택적 파일 기반 규칙 태그:** 

 태그를 사용하면 규칙 동작을 제어할 수 있습니다.

 **recentFiles** 

 이 태그는 가장 최근 파일을 먼저 유지하여 처리되는 파일 수를 제한합니다.

```
FileSize "s3://amzn-s3-demo-bucket/" > 5 B with recentFiles = 1
```

 **uriRegex** 

**참고**  
 `uriRegex` 태그는 AWS Glue 5.0 이상에서 사용할 수 있습니다.

 이 태그는 파일 경로에 정규식 패턴을 적용하여 파일을 필터링합니다. 경로가 패턴과 일치하는 파일만 처리됩니다. 부정적 예측을 사용하여 패턴과 일치하는 파일을 제외할 수도 있습니다.

```
# Match only files with a .dat extension
FileSize "s3://bucket/" > 5 B with uriRegex = "\.dat$"
# Exclude files ending in .tmp using a negative lookahead
FileSize "s3://bucket/" > 5 B with uriRegex = "(?!.*\.tmp$).*"
```

 **filterOrder** 

**참고**  
 `filterOrder` 태그는 AWS Glue 5.0 이상에서 사용할 수 있습니다.

 `recentFiles` 및 `uriRegex`와 같은 여러 필터 태그를 함께 사용하면 `filterOrder` 태그가 해당 태그의 적용 순서를 제어합니다. 기본 순서는 `recentFiles` 먼저, 그 다음에 `uriRegex`입니다.

```
FileSize "s3://bucket/" > 5 B with recentFiles = 5 with uriRegex = "\.dat$" with filterOrder = ["uriRegex","recentFiles"]
```

 **failFast** 

 `"true"`로 설정하면 규칙은 모든 파일을 평가하고 규정 준수 비율을 계산하는 대신 크기 조건에 통과하지 못한 첫 번째 파일에서 즉시 실패를 반환합니다.

```
FileSize "s3://bucket/" > 2 MB with failFast = "true"
```

 이때 몇 가지 고려 사항이 있습니다.

1.  AWS Glue ETL에서는 Amazon S3 또는 Data Catalog 변환 직후 DataQuality 평가 변환이 있어야 합니다.

1.  이 규칙은 AWS Glue 대화형 세션에서 작동하지 않습니다.

# API를 사용하여 데이터 품질 측정 및 관리
<a name="data-quality-using-apis"></a>

이 주제에서는 API를 사용하여 데이터 품질을 측정하고 관리하는 방법에 대해 설명합니다.

**Contents**
+ [사전 조건](#using-apis-prerequisites)
+ [AWS Glue Data Quality 권장 사용](#using-apis-recommendations)
+ [AWS Glue Data Quality 규칙 세트 사용](#using-apis-rulesets)
+ [AWS Glue Data Quality 실행 사용](#using-apis-runs)
+ [AWS Glue Data Quality 결과 사용](#using-apis-results)

## 사전 조건
<a name="using-apis-prerequisites"></a>
+ 최신 AWS Glue Data Quality API가 포함되도록 boto3 버전이 최신 버전인지 확인합니다.
+ 최신 CLI를 포함하도록 AWS CLI 버전이 최신인지 확인합니다.

AWS Glue 작업을 사용하여 이러한 API를 실행하는 경우 다음 옵션을 사용하여 boto3 라이브러리를 최신 버전으로 업데이트할 수 있습니다.

```
—additional-python-modules boto3==<version>
```

## AWS Glue Data Quality 권장 사용
<a name="using-apis-recommendations"></a>

**AWS Glue Data Quality 권장 실행을 시작하려면:**

```
class GlueWrapper:
    """Encapsulates AWS Glue actions."""
    def __init__(self, glue_client):
        """
        :param glue_client: A Boto3 AWS Glue client.
        """
        self.glue_client = glue_client
        
    def start_data_quality_rule_recommendation_run(self, database_name, table_name, role_arn):
        """
        Starts a recommendation run that is used to generate rules when you don't know what rules to write. AWS Glue Data Quality 
        analyzes the data and comes up with recommendations for a potential ruleset. You can then triage the ruleset 
        and modify the generated ruleset to your liking.

        :param database_name: The name of the AWS Glue database which contains the dataset.
        :param table_name: The name of the AWS Glue table against which we want a recommendation
        :param role_arn: The Amazon Resource Name (ARN) of an AWS Identity and Access Management (IAM) role that grants permission to let AWS Glue access the resources it needs.

        """
        try:
            response = self.client.start_data_quality_rule_recommendation_run(
                DataSource={
                    'GlueTable': {
                        'DatabaseName': database_name,
                        'TableName': table_name
                    }
                },
                Role=role_arn
            )
        except ClientError as err:
            logger.error(
                "Couldn't start data quality recommendation run %s. Here's why: %s: %s", name,
                err.response['Error']['Code'], err.response['Error']['Message'])
            raise
        else:
            return response['RunId']
```

권장 실행의 경우 `pushDownPredicates` 또는 `catalogPartitionPredicates`를 사용하여 성능을 개선하고 카탈로그 소스의 특정 파티션에서만 권장을 실행할 수 있습니다.

```
client.start_data_quality_rule_recommendation_run(
            DataSource={
                'GlueTable': {
                    'DatabaseName': database_name,
                    'TableName': table_name,
                    'AdditionalOptions': {
                        'pushDownPredicate': "year=2022"
                    }
                }
            },
            Role=role_arn,
            NumberOfWorkers=2,
            CreatedRulesetName='<rule_set_name>'
  )
```

**AWS Glue Data Quality 권장 실행 결과를 얻으려면:**

```
class GlueWrapper:
    """Encapsulates AWS Glue actions."""
    def __init__(self, glue_client):
        """
        :param glue_client: A Boto3 AWS Glue client.
        """
        self.glue_client = glue_client
    
    def get_data_quality_rule_recommendation_run(self, run_id):
        """
        Gets the specified recommendation run that was used to generate rules.

        :param run_id: The id of the data quality recommendation run
        
        """
        try:
            response = self.client.get_data_quality_rule_recommendation_run(RunId=run_id)
        except ClientError as err:
            logger.error(
                "Couldn't get data quality recommendation run %. Here's why: %s: %s", run_id,
                err.response['Error']['Code'], err.response['Error']['Message'])
            raise
        else:
            return response
```

위의 응답 객체에서 실행에서 권장한 규칙 세트를 추출하여 이후 단계에서 사용할 수 있습니다.

```
print(response['RecommendedRuleset'])

Rules = [
    RowCount between 2000 and 8000,
    IsComplete "col1",
    IsComplete "col2",
    StandardDeviation "col3" between 58138330.8 and 64258155.09,
    ColumnValues "col4" between 1000042965 and 1214474826,
    IsComplete "col5"
]
```

**필터링 및 나열할 수 있는 모든 권장 실행 목록을 가져오려면:**

```
response = client.list_data_quality_rule_recommendation_runs(
    Filter={
        'DataSource': {
            'GlueTable': {
                'DatabaseName': '<database_name>',
                'TableName': '<table_name>'
            }
        }
)
```

**기존 AWS Glue Data Quality 권장 작업을 취소하려면:**

```
response = client.cancel_data_quality_rule_recommendation_run(
    RunId='dqrun-d4b6b01957fdd79e59866365bf9cb0e40fxxxxxxx'
)
```

## AWS Glue Data Quality 규칙 세트 사용
<a name="using-apis-rulesets"></a>

**AWS Glue Data Quality 규칙 세트를 생성하려면:**

```
response = client.create_data_quality_ruleset(
    Name='<ruleset_name>',
    Ruleset='Rules = [IsComplete "col1", IsPrimaryKey "col2", RowCount between 2000 and 8000]',
    TargetTable={
        'TableName': '<table_name>',
        'DatabaseName': '<database_name>'
    }
)
```

**데이터 품질 규칙 세트를 가져오려면:**

```
response = client.get_data_quality_ruleset(
    Name='<ruleset_name>'
)
print(response)
```

이 API를 사용하여 규칙 세트를 추출할 수 있습니다.

```
print(response['Ruleset'])
```

**테이블의 모든 데이터 품질 규칙 세트를 나열하려면:**

```
response = client.list_data_quality_rulesets()
```

API 내의 필터 조건을 사용하여 특정 데이터베이스 또는 테이블에 연결된 모든 규칙 세트를 필터링할 수 있습니다.

```
response = client.list_data_quality_rulesets(
    Filter={
        'TargetTable': {
            'TableName': '<table_name>',
            'DatabaseName': '<database_name>'
        }
    },
)
```

**데이터 품질 규칙 세트를 업데이트하려면:**

```
class GlueWrapper:
    """Encapsulates AWS Glue actions."""
    def __init__(self, glue_client):
        """
        :param glue_client: A Boto3 AWS Glue client.
        """
        self.glue_client = glue_client
        
    def update_data_quality_ruleset(self, ruleset_name, ruleset_string):
        """
        Update an AWS Glue Data Quality Ruleset
        
        :param ruleset_name: The name of the AWS Glue Data Quality ruleset to update
        :param ruleset_string: The DQDL ruleset string to update the ruleset with

        """
        try:
            response = self.client.update_data_quality_ruleset(
                Name=ruleset_name,
                Ruleset=ruleset_string
            )
        except ClientError as err:
            logger.error(
                "Couldn't update the AWS Glue Data Quality ruleset. Here's why: %s: %s", 
                err.response['Error']['Code'], err.response['Error']['Message'])
            raise
        else:
            return response
```

**데이터 품질 규칙 세트를 삭제하려면:**

```
class GlueWrapper:
    """Encapsulates AWS Glue actions."""
    def __init__(self, glue_client):
        """
        :param glue_client: A Boto3 AWS Glue client.
        """
        self.glue_client = glue_client
        
    def delete_data_quality_ruleset(self, ruleset_name):
        """
        Delete a AWS Glue Data Quality Ruleset
        
        :param ruleset_name: The name of the AWS Glue Data Quality ruleset to delete

        """
        try:
            response = self.client.delete_data_quality_ruleset(
                Name=ruleset_name
            )
        except ClientError as err:
            logger.error(
                "Couldn't delete the AWS Glue Data Quality ruleset. Here's why: %s: %s", 
                err.response['Error']['Code'], err.response['Error']['Message'])
            raise
        else:
            return response
```

## AWS Glue Data Quality 실행 사용
<a name="using-apis-runs"></a>

**AWS Glue Data Quality 실행을 시작하려면:**

```
class GlueWrapper:
    """Encapsulates AWS Glue actions."""
    def __init__(self, glue_client):
        """
        :param glue_client: A Boto3 AWS Glue client.
        """
        self.glue_client = glue_client
        
    def start_data_quality_ruleset_evaluation_run(self, database_name, table_name, role_name, ruleset_list):
        """
        Start an AWS Glue Data Quality evaluation run
        
        :param database_name: The name of the AWS Glue database which contains the dataset.
        :param table_name: The name of the AWS Glue table against which we want to evaluate.
        :param role_arn: The Amazon Resource Name (ARN) of an AWS Identity and Access Management (IAM) role that grants permission to let AWS Glue access the resources it needs. 
        :param ruleset_list: The list of AWS Glue Data Quality ruleset names to evaluate.

        """
        try:
            response = client.start_data_quality_ruleset_evaluation_run(
                DataSource={
                    'GlueTable': {
                        'DatabaseName': database_name,
                        'TableName': table_name
                    }
                },
                Role=role_name,
                RulesetNames=ruleset_list
            )
        except ClientError as err:
            logger.error(
                "Couldn't start the AWS Glue Data Quality Run. Here's why: %s: %s", 
                err.response['Error']['Code'], err.response['Error']['Message'])
            raise
        else:
            return response['RunId']
```

`pushDownPredicate` 또는 `catalogPartitionPredicate` 파라미터를 전달하여 카탈로그 테이블 내의 특정 파티션 세트만 대상으로 데이터 품질 실행을 수행할 수 있습니다. 예:

```
response = client.start_data_quality_ruleset_evaluation_run(
    DataSource={
        'GlueTable': {
            'DatabaseName': '<database_name>',
            'TableName': '<table_name>',
            'AdditionalOptions': {
                'pushDownPredicate': 'year=2023'
            }
        }
    },
    Role='<role_name>',
    NumberOfWorkers=5,
    Timeout=123,
    AdditionalRunOptions={
        'CloudWatchMetricsEnabled': False
    },
    RulesetNames=[
        '<ruleset_name>',
    ]
)
```

 또한 ROW 또는 COLUMN 수준에서 규칙 세트의 복합 규칙을 평가하는 방법도 구성할 수 있습니다. 복합 규칙의 작동 방식에 대한 자세한 내용은 설명서에서 [복합 규칙 작동 방식](dqdl.md#dqdl-syntax-composite-rules)을 참조하십시오.

 요청에서 복합 규칙 평가 방법을 설정하는 방법을 보여주는 예: 

```
response = client.start_data_quality_ruleset_evaluation_run(
    DataSource={
        'GlueTable': {
            'DatabaseName': '<database_name>',
            'TableName': '<table_name>',
            'AdditionalOptions': {
                'pushDownPredicate': 'year=2023'
            }
        }
    },
    Role='<role_name>',
    NumberOfWorkers=5,
    Timeout=123,
    AdditionalRunOptions={
        'CompositeRuleEvaluationMethod':ROW
    },
    RulesetNames=[
        '<ruleset_name>',
    ]
)
```

 **AWS Glue Data Quality 실행에 대한 정보를 가져오려면:** 

```
class GlueWrapper:
    """Encapsulates AWS Glue actions."""
    def __init__(self, glue_client):
        """
        :param glue_client: A Boto3 AWS Glue client.
        """
        self.glue_client = glue_client
        
    def get_data_quality_ruleset_evaluation_run(self, run_id):
        """
        Get details about an AWS Glue Data Quality Run
        
        :param run_id: The AWS Glue Data Quality run ID to look up

        """
        try:
            response = self.client.get_data_quality_ruleset_evaluation_run(
                RunId=run_id
            )
        except ClientError as err:
            logger.error(
                "Couldn't look up the AWS Glue Data Quality run ID. Here's why: %s: %s", 
                err.response['Error']['Code'], err.response['Error']['Message'])
            raise
        else:
            return response
```

**AWS Glue Data Quality 실행 결과를 가져오려면:**

해당 AWS Glue Data Quality 실행에 대해 다음 방법을 사용하여 실행 평가 결과를 추출할 수 있습니다.

```
response = client.get_data_quality_ruleset_evaluation_run(
    RunId='d4b6b01957fdd79e59866365bf9cb0e40fxxxxxxx'
)

resultID = response['ResultIds'][0]

response = client.get_data_quality_result(
    ResultId=resultID
)

print(response['RuleResults'])
```

**AWS Glue Data Quality 실행을 모두 나열하려면:**

```
class GlueWrapper:
    """Encapsulates AWS Glue actions."""
    def __init__(self, glue_client):
        """
        :param glue_client: A Boto3 AWS Glue client.
        """
        self.glue_client = glue_client
        
    def list_data_quality_ruleset_evaluation_runs(self, database_name, table_name):
        """
        Lists all the AWS Glue Data Quality runs against a given table
        
        :param database_name: The name of the database where the data quality runs 
        :param table_name: The name of the table against which the data quality runs were created
        
        """
        try:
            response = self.client.list_data_quality_ruleset_evaluation_runs(
                Filter={
                    'DataSource': {
                        'GlueTable': {
                            'DatabaseName': database_name,
                            'TableName': table_name
                        }
                    }
                }
            )
        except ClientError as err:
            logger.error(
                "Couldn't list the AWS Glue Quality runs. Here's why: %s: %s", 
                err.response['Error']['Code'], err.response['Error']['Message'])
            raise
        else:
            return response
```

특정 시간 사이의 결과 또는 특정 테이블에 대해 실행된 결과만 표시하도록 filter 절을 수정할 수 있습니다.

**진행 중인 AWS Glue Data Quality 실행을 중지하려면:**

```
class GlueWrapper:
    """Encapsulates AWS Glue actions."""
    def __init__(self, glue_client):
        """
        :param glue_client: A Boto3 AWS Glue client.
        """
        self.glue_client = glue_client
        
    def cancel_data_quality_ruleset_evaluation_run(self, result_id):
        """
        Cancels a given AWS Glue Data Quality run
        
        :param result_id: The result id of a AWS Glue Data Quality run to cancel
        
        """
        try:
            response = self.client.cancel_data_quality_ruleset_evaluation_run(
                ResultId=result_id
            )
        except ClientError as err:
            logger.error(
                "Couldn't cancel the AWS Glue Data Quality run. Here's why: %s: %s", 
                err.response['Error']['Code'], err.response['Error']['Message'])
            raise
        else:
            return response
```

## AWS Glue Data Quality 결과 사용
<a name="using-apis-results"></a>

 **AWS Glue Data Quality 실행 결과를 가져오려면:** 

```
class GlueWrapper:
    """Encapsulates AWS Glue actions."""
    def __init__(self, glue_client):
        """
        :param glue_client: A Boto3 AWS Glue client.
        """
        self.glue_client = glue_client
        
    def get_data_quality_result(self, result_id):
        """
        Outputs the result of an AWS Glue Data Quality Result
        
        :param result_id: The result id of an AWS Glue Data Quality run
        
        """
        try:
            response = self.client.get_data_quality_result(
                ResultId=result_id
            )
        except ClientError as err:
            logger.error(
                "Couldn't get the AWS Glue Data Quality result. Here's why: %s: %s", 
                err.response['Error']['Code'], err.response['Error']['Message'])
            raise
        else:
            return response
```

 **특정 데이터 품질 결과에 대해 수집된 통계를 보려면:** 

```
import boto3
from botocore.exceptions import ClientError
import logging

logger = logging.getLogger(__name__)
class GlueWrapper:
    """Encapsulates AWS Glue actions."""
    def __init__(self, glue_client):
        """
        :param glue_client: A Boto3 AWS Glue client.
        """
        self.glue_client = glue_client
        
    def get_profile_for_data_quality_result(self, result_id):
        """
        Outputs the statistic profile for a AWS Glue Data Quality Result
        
        :param result_id: The result id of a AWS Glue Data Quality run
        
        """
        try:
            response = self.glue_client.get_data_quality_result(
                ResultId=result_id
            )
            
            # the profile contains all statistics gathered for the result
            profile_id = response['ProfileId']
            profile = self.glue_client.list_data_quality_statistics(
                ProfileId = profile_id
            )            
            return profile                        
        except ClientError as err:
            logger.error(
                "Couldn't retrieve Data Quality profile. Here's why: %s: %s", 
                err.response['Error']['Code'], err.response['Error']['Message'])
            raise
```

 **여러 데이터 품질 실행에서 수집된 통계의 시계열을 보려면:** 

```
class GlueWrapper:
    """Encapsulates AWS Glue actions."""
    def __init__(self, glue_client):
        """
        :param glue_client: A Boto3 AWS Glue client.
        """
        self.glue_client = glue_client

    def get_statistics_for_data_quality_result(self, profile_id):
        """
        Outputs an array of datapoints for each statistic in the input result.

        :param result_id: The profile id of a AWS Glue Data Quality run

        """
        try:
            profile = self.glue_client.list_data_quality_statistics(
                ProfileId = profile_id
            )
            statistics = [self.glue_client.list_data_quality_statistics(
                StatisticId = s['StatisticId']
            ) for s in profile['Statistics']]
            return statistics
        except ClientError as err:
            logger.error(
                "Couldn't retrieve Data Quality statistics. Here's why: %s: %s",
                err.response['Error']['Code'], err.response['Error']['Message'])
            raise
```

 **특정 통계에 대한 이상 탐지 모델을 보려면:** 

```
class GlueWrapper:
    """Encapsulates AWS Glue actions."""
    def __init__(self, glue_client):
        """
        :param glue_client: A Boto3 AWS Glue client.
        """
        self.glue_client = glue_client

    def get_model_training_result_for_statistic(self, statistic_id, profile_id):
        """
        Outputs the details (bounds) of anomaly detection training for the given statistic at the given profile.

        :param statistic_id the model's statistic (the timeseries it is tracking)
        :param profile_id the profile associated with the model (a point in the timeseries)

        """
        try:
            model = self.glue_client.get_data_quality_model_result(
                ProfileId = profile_id, StatisticId = statistic_id
            )
            return model
        except ClientError as err:
            logger.error(
                "Couldn't retrieve Data Quality model results. Here's why: %s: %s",
                err.response['Error']['Code'], err.response['Error']['Message'])
            raise
```

 **통계 모델의 이상 탐지 기준에서 데이터 포인트를 제외하려면:** 

```
class GlueWrapper:
    """Encapsulates AWS Glue actions."""
    def __init__(self, glue_client):
        """
        :param glue_client: A Boto3 AWS Glue client.
        """
        self.glue_client = glue_client

    def apply_exclusions_to_statistic(self, statistic_id, profile_ids):
        """
        Annotate some points along a given statistic timeseries.
        
        This example excludes the provided values; INCLUDE can also be used to undo this action.

        :param statistic_id the statistic timeseries to annotate
        :param profile_id the profiles we want to exclude (points in the timeseries)

        """

        try:
            response = self.glue_client.batch_put_data_quality_statistic_annotation(
                    InclusionAnnotations = [
                        {'ProfileId': prof_id, 
                        'StatisticId': statistic_id, 
                        'InclusionAnnotation': 'EXCLUDE'} for prof_id in profile_ids
                    ]
            )
            return response['FailedInclusionAnnotations']
        except ClientError as err:
            logger.error(
                "Couldn't store Data Quality annotations. Here's why: %s: %s",
                err.response['Error']['Code'], err.response['Error']['Message'])
            raise
```

 **특정 통계에 대한 이상 탐지 모델을 보려면:** 

```
class GlueWrapper:
    """Encapsulates AWS Glue actions."""
    def __init__(self, glue_client):
        """
        :param glue_client: A Boto3 AWS Glue client.
        """
        self.glue_client = glue_client

    def get_model_training_status_for_statistic(self, statistic_id, profile_id):
        """
        Outputs the status of anomaly detection training for the given statistic at the given profile.

        :param statistic_id the model's statistic (the timeseries it is tracking)
        :param profile_id the profile associated with the model (a point in the timeseries)

        """
        try:
            model = self.glue_client.get_data_quality_model(
                ProfileId = profile_id, StatisticId = statistic_id
            )
            return model
        except ClientError as err:
            logger.error(
                "Couldn't retrieve Data Quality statistics. Here's why: %s: %s",
                err.response['Error']['Code'], err.response['Error']['Message'])
            raise
```

 **이상 탐지 기준에서 특정 데이터 품질 실행의 모든 결과를 제외하려면:** 

```
class GlueWrapper:
    """Encapsulates AWS Glue actions."""
    def __init__(self, glue_client):
        """
        :param glue_client: A Boto3 AWS Glue client.
        """
        self.glue_client = glue_client

    def apply_exclusions_to_profile(self, profile_id):
        """
        Exclude datapoints produced by a run across statistic timeseries.

        This example excludes the provided values; INCLUDE can also be used to undo this action.

        :param profile_id the profiles we want to exclude (points in the timeseries)

        """
        try:
            response = self.glue_client.put_data_quality_profile_annotation(
                    ProfileId = profile_id,
                    InclusionAnnotation = "EXCLUDE"
            )
            return response
        except ClientError as err:
            logger.error(
                "Couldn't store Data Quality annotations. Here's why: %s: %s",
                err.response['Error']['Code'], err.response['Error']['Message'])
            raise
```

 **특정 데이터 품질 실행의 결과를 가져와 결과를 표시하려면:** 

 AWS Glue Data Quality `runID`를 사용되면 아래와 같이 `resultID`을(를) 추출하여 실제 결과를 얻을 수 있습니다.

```
response = client.get_data_quality_ruleset_evaluation_run(
    RunId='dqrun-abca77ee126abe1378c1da1ae0750d7dxxxx'
)

resultID = response['ResultIds'][0]

response = client.get_data_quality_result(
    ResultId=resultID
)

print(resp['RuleResults'])
```

# 알림, 배포 및 예약 설정
<a name="data-quality-alerts"></a>

이 주제에서는 AWS Glue Data Quality에 대한 알림, 배포 및 예약을 설정하는 방법을 설명합니다.

**Contents**
+ [Amazon EventBridge 통합에서 알림 설정](#data-quality-alerts-eventbridge)
  + [이벤트 패턴의 추가 구성 옵션](#data-quality-alerts-eventbridge-config-options)
  + [알림을 이메일 형식으로 지정](#data-quality-alerts-eventbridge-format-notifications)
+ [CloudWatch 통합에서 경보 및 알림 설정](#data-quality-alerts-cloudwatch)
+ [데이터 품질 결과를 쿼리하여 대시보드 구축](#data-quality-alerts-querying-results)
+ [AWS CloudFormation을 사용하여 데이터 품질 규칙 배포](#data-quality-deploy-cfn)
+ [데이터 품질 규칙 예약](#data-quality-scheduling-rules)

## Amazon EventBridge 통합에서 알림 설정
<a name="data-quality-alerts-eventbridge"></a>

AWS Glue Data Quality는 데이터 품질 규칙 세트 평가 실행 완료 시 생성되는 EventBridge 이벤트의 게시를 지원합니다. 이를 통해 데이터 품질 규칙 실패 시 알림을 쉽게 설정할 수 있습니다.

다음은 데이터 카탈로그에서 데이터 품질 규칙 세트를 평가할 때 발생하는 샘플 이벤트입니다. 이 정보를 사용하여 Amazon EventBridge에서 사용할 수 있는 데이터를 검토할 수 있습니다. 추가 API 직접 호출을 통해 자세한 내용을 확인할 수 있습니다. 예를 들어 결과 ID로 `get_data_quality_result` API를 직접 호출하여 특정 실행의 세부 정보를 가져옵니다.

```
{
    "version":"0",
    "id":"abcdef00-1234-5678-9abc-def012345678",
    "detail-type":"Data Quality Evaluation Results Available",
    "source":"aws.glue-dataquality",
    "account":"123456789012",
    "time":"2017-09-07T18:57:21Z",
    "region":"us-west-2",
    "resources":[],
    "detail":{
        "context": {
                    "contextType": "GLUE_DATA_CATALOG",
                    "runId":"dqrun-12334567890",
                    "databaseName": "db-123",
                    "tableName": "table-123",
                    "catalogId": "123456789012"
                    },
        "resultID": "dqresult-12334567890",
        "rulesetNames": ["rulset1"],
        "state":"SUCCEEDED",
        "score": 1.00,
        "rulesSucceeded": 100,
        "rulesFailed": 0,
        "rulesSkipped": 0
    }
}
```

다음은 AWS Glue ETL 또는 AWS Glue Studio 노트북에서 데이터 품질 규칙 세트를 평가할 때 게시되는 샘플 이벤트입니다.

```
{
    "version":"0",
    "id":"abcdef00-1234-5678-9abc-def012345678",
    "detail-type":"Data Quality Evaluation Results Available",
    "source":"aws.glue-dataquality",
    "account":"123456789012",
    "time":"2017-09-07T18:57:21Z",
    "region":"us-west-2",
    "resources":[],
    "detail":{
        "context": {
                    "contextType": "GLUE_JOB",
                    "jobId": "jr-12334567890",
                    "jobName": "dq-eval-job-1234",
                    "evaluationContext": "", 
                    }
        "resultID": "dqresult-12334567890",
        "rulesetNames": ["rulset1"],
        "state":"SUCCEEDED",
        "score": 1.00
        "rulesSucceeded": 100,
        "rulesFailed": 0,
        "rulesSkipped": 0
    }
}
```

Data Catalog와 ETL 작업 모두에서 데이터 품질 평가를 실행하는 경우, 기본적으로 선택되는 **Amazon CloudWatch에 지표 게시** 옵션을 선택한 상태로 유지해야 EventBridge에 게시할 수 있습니다.

**EventBridge 알림 설정**

![\[AWS CloudFormation에서 데이터 품질 속성\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/data-quality-properties-cfn.png)


생성된 이벤트를 수신하고 대상을 정의하려면 Amazon EventBridge 규칙을 구성해야 합니다. 규칙을 생성하려면:

1. Amazon EventBridge 콘솔을 엽니다.

1. 탐색 표시줄의 **버스** 섹션에서 **규칙**을 선택합니다.

1. [**Create Rule**]을 선택합니다.

1. **규칙 세부 정보 정의**에서:

   1. 이름에 `myDQRule`을 입력합니다.

   1. 설명을 입력합니다(선택 사항).

   1. 이벤트 버스의 경우 이벤트 버스를 선택합니다. 이벤트 버스가 아직 없는 경우 기본값으로 둡니다.

   1. 규칙 유형에서 **이벤트 패턴이 있는 규칙**을 선택하고 **다음**을 선택합니다.

1. **이벤트 패턴 작성**에서: 

   1. 이벤트 소스에서 **AWS 이벤트 또는 EventBridge 파트너 이벤트**를 선택합니다.

   1. 샘플 이벤트 섹션은 건너뜁니다.

   1. 생성 방법으로 **패턴 양식 사용**을 선택합니다.

   1. 이벤트 패턴의 경우:

      1. 이벤트 소스에 대한 **AWS 서비스**를 선택합니다.

      1. AWS 서비스에 대한 **Glue Data Quality**를 선택합니다.

      1. 이벤트 유형에 대해 **사용할 수 있는 데이터 품질 평가 결과**를 선택합니다.

      1. 특정 상태에 대해 **실패**를 선택합니다. 그러면 다음과 비슷한 이벤트 패턴이 나타납니다.

         ```
         {
           "source": ["aws.glue-dataquality"],
           "detail-type": ["Data Quality Evaluation Results Available"],
           "detail": {
             "state": ["FAILED"]
           }
         }
         ```

      1. 더 많은 구성 옵션은 [이벤트 패턴의 추가 구성 옵션](#data-quality-alerts-eventbridge-config-options) 섹션을 참조하세요.

1. **대상 선택**에서:

   1. **대상 유형**에 대해 **AWS 서비스**를 선택합니다.

   1. **대상 선택** 드롭다운을 사용하여 연결하려는 AWS 서비스(SNS, Lambda, SQS 등)를 선택하고 **다음**을 선택합니다.

1. **태그 구성**에서 **새 태그 추가**를 클릭하여 선택적 태그를 추가하고 **다음**을 선택합니다.

1. 모든 선택 항목의 요약 페이지가 표시됩니다. 하단에서 **규칙 생성**을 선택합니다.

### 이벤트 패턴의 추가 구성 옵션
<a name="data-quality-alerts-eventbridge-config-options"></a>

성공 또는 실패 시 이벤트 필터링 외에도 다양한 파라미터에서 이벤트를 추가로 필터링할 수 있습니다.

이렇게 하려면 이벤트 패턴 섹션으로 이동한 다음 **패턴 편집**을 선택하여 추가 파라미터를 지정합니다. 이벤트 패턴의 필드는 대소문자를 구분합니다. 다음은 이벤트 패턴 구성에 대한 예제입니다.

특정 규칙 세트를 평가하는 특정 테이블의 이벤트를 캡처하려면 다음 유형의 패턴을 사용합니다.

```
{
  "source": ["aws.glue-dataquality"],
  "detail-type": ["Data Quality Evaluation Results Available"],
  "detail": {
    "context": {
      "contextType": ["GLUE_DATA_CATALOG"],
      "databaseName": "db-123",
       "tableName": "table-123",
    },
    "rulesetNames": ["ruleset1", "ruleset2"]
    "state": ["FAILED"]
  }
}
```

ETL 환경에서 특정 작업의 이벤트를 캡처하려면 다음 유형의 패턴을 사용합니다.

```
{
  "source": ["aws.glue-dataquality"],
  "detail-type": ["Data Quality Evaluation Results Available"],
  "detail": {
    "context": {
      "contextType": ["GLUE_JOB"],
      "jobName": ["dq_evaluation_job1", "dq_evaluation_job2"]
    },
    "state": ["FAILED"]
  }
}
```

점수가 특정 임계값(예: 70%) 미만인 이벤트를 캡처하려면:

```
{
  "source": ["aws.glue-dataquality"],
  "detail-type": ["Data Quality Evaluation Results Available"],
  "detail": {
    "score": [{
      "numeric": ["<=", 0.7]
    }]
  }
}
```

### 알림을 이메일 형식으로 지정
<a name="data-quality-alerts-eventbridge-format-notifications"></a>

비즈니스 팀에 올바른 형식의 이메일 알림을 보내야 하는 경우가 있습니다. Amazon EventBridge와 AWS Lambda를 사용하면 됩니다.

![\[이메일 형식의 데이터 품질 알림\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/data_quality_sample_email.png)


다음 샘플 코드를 사용하여 데이터 품질 알림 형식을 지정하여 이메일을 생성할 수 있습니다.

```
import boto3
import json
from datetime import datetime

sns_client = boto3.client('sns')
glue_client = boto3.client('glue')

sns_topic_arn = 'arn:aws:sns:<region-code>:<account-id>:<sns-topic-name>'



def lambda_handler(event, context):
    log_metadata = {}
    message_text = ""
    subject_text = ""

    if event['detail']['context']['contextType'] == 'GLUE_DATA_CATALOG':
        log_metadata['ruleset_name'] = str(event['detail']['rulesetNames'][0])
        log_metadata['tableName'] = str(event['detail']['context']['tableName'])
        log_metadata['databaseName'] = str(event['detail']['context']['databaseName'])
        log_metadata['runId'] = str(event['detail']['context']['runId'])
        log_metadata['resultId'] = str(event['detail']['resultId'])
        log_metadata['state'] = str(event['detail']['state'])
        log_metadata['score'] = str(event['detail']['score'])
        log_metadata['numRulesSucceeded'] = str(event['detail']['numRulesSucceeded'])
        log_metadata['numRulesFailed'] = str(event['detail']['numRulesFailed'])
        log_metadata['numRulesSkipped'] = str(event['detail']['numRulesSkipped'])

        message_text += "Glue Data Quality run details:\n"
        message_text += "ruleset_name: {}\n".format(log_metadata['ruleset_name'])
        message_text += "glue_table_name: {}\n".format(log_metadata['tableName'])
        message_text += "glue_database_name: {}\n".format(log_metadata['databaseName'])
        message_text += "run_id: {}\n".format(log_metadata['runId'])
        message_text += "result_id: {}\n".format(log_metadata['resultId'])
        message_text += "state: {}\n".format(log_metadata['state'])
        message_text += "score: {}\n".format(log_metadata['score'])
        message_text += "numRulesSucceeded: {}\n".format(log_metadata['numRulesSucceeded'])
        message_text += "numRulesFailed: {}\n".format(log_metadata['numRulesFailed'])
        message_text += "numRulesSkipped: {}\n".format(log_metadata['numRulesSkipped'])

        subject_text = "Glue Data Quality ruleset {} run details".format(log_metadata['ruleset_name'])

    else:
        log_metadata['ruleset_name'] = str(event['detail']['rulesetNames'][0])
        log_metadata['jobName'] = str(event['detail']['context']['jobName'])
        log_metadata['jobId'] = str(event['detail']['context']['jobId'])
        log_metadata['resultId'] = str(event['detail']['resultId'])
        log_metadata['state'] = str(event['detail']['state'])
        log_metadata['score'] = str(event['detail']['score'])

        log_metadata['numRulesSucceeded'] = str(event['detail']['numRulesSucceeded'])
        log_metadata['numRulesFailed'] = str(event['detail']['numRulesFailed'])
        log_metadata['numRulesSkipped'] = str(event['detail']['numRulesSkipped'])

        message_text += "Glue Data Quality run details:\n"
        message_text += "ruleset_name: {}\n".format(log_metadata['ruleset_name'])
        message_text += "glue_job_name: {}\n".format(log_metadata['jobName'])
        message_text += "job_id: {}\n".format(log_metadata['jobId'])
        message_text += "result_id: {}\n".format(log_metadata['resultId'])
        message_text += "state: {}\n".format(log_metadata['state'])
        message_text += "score: {}\n".format(log_metadata['score'])
        message_text += "numRulesSucceeded: {}\n".format(log_metadata['numRulesSucceeded'])
        message_text += "numRulesFailed: {}\n".format(log_metadata['numRulesFailed'])
        message_text += "numRulesSkipped: {}\n".format(log_metadata['numRulesSkipped'])

        subject_text = "Glue Data Quality ruleset {} run details".format(log_metadata['ruleset_name'])

    resultID = str(event['detail']['resultId'])
    response = glue_client.get_data_quality_result(ResultId=resultID)
    RuleResults = response['RuleResults']
    message_text += "\n\nruleset details evaluation steps results:\n\n"
    subresult_info = []

    for dic in RuleResults:
        subresult = "Name: {}\t\tResult: {}\t\tDescription: \t{}".format(dic['Name'], dic['Result'], dic['Description'])
        if 'EvaluationMessage' in dic:
            subresult += "\t\tEvaluationMessage: {}".format(dic['EvaluationMessage'])
        subresult_info.append({
            'Name': dic['Name'],
            'Result': dic['Result'],
            'Description': dic['Description'],
            'EvaluationMessage': dic.get('EvaluationMessage', '')
        })
        message_text += "\n" + subresult

    log_metadata['resultrun'] = subresult_info



    sns_client.publish(
        TopicArn=sns_topic_arn,
        Message=message_text,
        Subject=subject_text
    )

    return {
        'statusCode': 200,
        'body': json.dumps('Message published to SNS topic')
    }
```

## CloudWatch 통합에서 경보 및 알림 설정
<a name="data-quality-alerts-cloudwatch"></a>

Amazon EventBridge를 사용하여 데이터 품질 알림을 설정하는 것이 좋습니다. Amazon EventBridge는 고객에게 알림을 보낼 때 일회성 설정을 요구하기 때문입니다. 하지만 익숙하기 때문에 Amazon CloudWatch를 선호하는 고객도 있습니다. 이러한 고객을 위해 Amazon CloudWatch와의 통합을 제공합니다.

각 AWS Glue Data Quality 평가에서는 데이터 품질 실행당 `glue.data.quality.rules.passed`(통과한 규칙의 수를 나타냄) 및 `glue.data.quality.rules.failed`(실패한 규칙의 수를 나타냄)와 같은 지표 페어를 생성합니다. 이 생성된 지표를 사용하여 해당 데이터 품질 실행이 임계값 아래로 떨어질 경우 사용자에게 알리는 경보를 생성할 수 있습니다. Amazon SNS 알림을 통해 이메일을 보내는 경보 설정을 시작하려면 아래 단계를 수행합니다.

Amazon SNS 알림을 통해 이메일을 보내는 경보 설정을 시작하려면 아래 단계를 수행합니다.

1. Amazon CloudWatch 콘솔을 엽니다.

1. **지표** 아래에서 **모든 지표**를 선택합니다. Glue Data Quality라는 사용자 지정 네임스페이스 아래에 추가 네임스페이스가 표시됩니다.
**참고**  
AWS Glue 데이터 품질 실행을 시작할 때 **Amazon CloudWatch에 지표 게시** 확인란이 활성화되어 있는지 확인합니다. 그렇지 않으면 특정 실행에 대한 지표가 Amazon CloudWatch에 게시되지 않습니다.

   `Glue Data Quality` 네임스페이스 아래에서 테이블 및 규칙 세트별로 지표가 생성되었음을 알 수 있습니다. 이 주제의 목적에 따라 이 값이 1을 초과하는 경우 `glue.data.quality.rules.failed` 규칙 및 경보를 사용합니다(즉, 실패한 규칙 평가 수가 1보다 크면 알림을 제공하려고 함).

1. 경보를 생성하려면 **경보** 아래에서 **모든 경보**를 선택합니다.

1. **경보 생성**을 선택하세요.

1. **지표 선택**을 선택하세요.

1. 생성한 테이블에 해당하는 `glue.data.quality.rules.failed` 지표를 선택한 다음 **지표 선택**을 선택합니다.

1. **지표 및 조건 지정** 탭의 **지표** 섹션 아래에서:

   1. **Statistic(통계)**에서 **Sum(합계)**를 선택합니다.

   1. **기간**에서 **1분**을 선택합니다.

1. **조건** 섹션에서:

   1. **임계값 유형(Threshold type)**에서 **정적(Static)**을 선택합니다.

   1. **glue.data.quality.rules.failed 조건이 다음과 같을 때마다...**에서 **이상**을 선택합니다.

   1. **기준...**에서 임계값으로 **1**을 입력합니다.

   이렇게 선택하면 `glue.data.quality.rules.failed` 지표가 1 이상의 값을 생성하는 경우 경보가 트리거됩니다. 하지만 데이터가 없으면 허용 가능한 값으로 간주합니다.

1. **다음**을 선택합니다.

1. **작업 구성**에서:

   1. **경보 상태 트리거**에서 **경보 내**를 선택합니다.

   1. **다음 SNS 주제로 알림 보내기** 섹션에서 **새 주제를 생성하여 새 SNS 주제를 통해 알림 보내기**를 선택합니다.

   1. **알림을 수신할 이메일 엔드포인트**에 이메일 주소를 입력합니다. 그리고 **주제 생성**을 클릭합니다.

   1. **다음**을 선택합니다.

1. **경보 이름**에 `myFirstDQAlarm`을 입력한 후 **다음**을 선택합니다.

1. 모든 선택 항목의 요약 페이지가 표시됩니다. 하단에서 **경보 생성**을 선택합니다.

이제 Amazon CloudWatch 경보 대시보드에서 경보가 생성되는 것을 볼 수 있습니다.

## 데이터 품질 결과를 쿼리하여 대시보드 구축
<a name="data-quality-alerts-querying-results"></a>

대시보드를 구축하여 데이터 품질 결과를 표시할 수 있습니다. 이렇게 하는 방법은 두 가지입니다.

**다음 코드를 사용하여 Amazon S3에 데이터를 쓰도록 Amazon EventBridge 설정:**

```
import boto3
import json
from datetime import datetime


s3_client = boto3.client('s3')
glue_client = boto3.client('glue')


s3_bucket = 's3-bucket-name'

def write_logs(log_metadata):
    try:
        filename = datetime.now().strftime("%m%d%Y%H%M%S") + ".json"
        key_opts = {
            'year': datetime.now().year,
            'month': "{:02d}".format(datetime.now().month),
            'day': "{:02d}".format(datetime.now().day),
            'filename': filename
        }
        s3key = "gluedataqualitylogs/year={year}/month={month}/day={day}/{filename}".format(**key_opts)
        s3_client.put_object(Bucket=s3_bucket, Key=s3key, Body=json.dumps(log_metadata))
    except Exception as e:
        print(f'Error writing logs to S3: {e}')


def lambda_handler(event, context):
    log_metadata = {}
    message_text = ""
    subject_text = ""

    if event['detail']['context']['contextType'] == 'GLUE_DATA_CATALOG':
        log_metadata['ruleset_name'] = str(event['detail']['rulesetNames'][0])
        log_metadata['tableName'] = str(event['detail']['context']['tableName'])
        log_metadata['databaseName'] = str(event['detail']['context']['databaseName'])
        log_metadata['runId'] = str(event['detail']['context']['runId'])
        log_metadata['resultId'] = str(event['detail']['resultId'])
        log_metadata['state'] = str(event['detail']['state'])
        log_metadata['score'] = str(event['detail']['score'])
        log_metadata['numRulesSucceeded'] = str(event['detail']['numRulesSucceeded'])
        log_metadata['numRulesFailed'] = str(event['detail']['numRulesFailed'])
        log_metadata['numRulesSkipped'] = str(event['detail']['numRulesSkipped'])

        message_text += "Glue Data Quality run details:\n"
        message_text += "ruleset_name: {}\n".format(log_metadata['ruleset_name'])
        message_text += "glue_table_name: {}\n".format(log_metadata['tableName'])
        message_text += "glue_database_name: {}\n".format(log_metadata['databaseName'])
        message_text += "run_id: {}\n".format(log_metadata['runId'])
        message_text += "result_id: {}\n".format(log_metadata['resultId'])
        message_text += "state: {}\n".format(log_metadata['state'])
        message_text += "score: {}\n".format(log_metadata['score'])
        message_text += "numRulesSucceeded: {}\n".format(log_metadata['numRulesSucceeded'])
        message_text += "numRulesFailed: {}\n".format(log_metadata['numRulesFailed'])
        message_text += "numRulesSkipped: {}\n".format(log_metadata['numRulesSkipped'])

        subject_text = "Glue Data Quality ruleset {} run details".format(log_metadata['ruleset_name'])

    else:
        log_metadata['ruleset_name'] = str(event['detail']['rulesetNames'][0])
        log_metadata['jobName'] = str(event['detail']['context']['jobName'])
        log_metadata['jobId'] = str(event['detail']['context']['jobId'])
        log_metadata['resultId'] = str(event['detail']['resultId'])
        log_metadata['state'] = str(event['detail']['state'])
        log_metadata['score'] = str(event['detail']['score'])

        log_metadata['numRulesSucceeded'] = str(event['detail']['numRulesSucceeded'])
        log_metadata['numRulesFailed'] = str(event['detail']['numRulesFailed'])
        log_metadata['numRulesSkipped'] = str(event['detail']['numRulesSkipped'])

        message_text += "Glue Data Quality run details:\n"
        message_text += "ruleset_name: {}\n".format(log_metadata['ruleset_name'])
        message_text += "glue_job_name: {}\n".format(log_metadata['jobName'])
        message_text += "job_id: {}\n".format(log_metadata['jobId'])
        message_text += "result_id: {}\n".format(log_metadata['resultId'])
        message_text += "state: {}\n".format(log_metadata['state'])
        message_text += "score: {}\n".format(log_metadata['score'])
        message_text += "numRulesSucceeded: {}\n".format(log_metadata['numRulesSucceeded'])
        message_text += "numRulesFailed: {}\n".format(log_metadata['numRulesFailed'])
        message_text += "numRulesSkipped: {}\n".format(log_metadata['numRulesSkipped'])

        subject_text = "Glue Data Quality ruleset {} run details".format(log_metadata['ruleset_name'])

    resultID = str(event['detail']['resultId'])
    response = glue_client.get_data_quality_result(ResultId=resultID)
    RuleResults = response['RuleResults']
    message_text += "\n\nruleset details evaluation steps results:\n\n"
    subresult_info = []

    for dic in RuleResults:
        subresult = "Name: {}\t\tResult: {}\t\tDescription: \t{}".format(dic['Name'], dic['Result'], dic['Description'])
        if 'EvaluationMessage' in dic:
            subresult += "\t\tEvaluationMessage: {}".format(dic['EvaluationMessage'])
        subresult_info.append({
            'Name': dic['Name'],
            'Result': dic['Result'],
            'Description': dic['Description'],
            'EvaluationMessage': dic.get('EvaluationMessage', '')
        })
        message_text += "\n" + subresult

    log_metadata['resultrun'] = subresult_info

    write_logs(log_metadata)


    return {
        'statusCode': 200,
        'body': json.dumps('Message published to SNS topic')
    }
```

Amazon S3에 데이터를 쓴 후 AWS Glue 크롤러를 사용하여 Athena에 등록하고 테이블을 쿼리할 수 있습니다.

**데이터 품질 평가 중에 Amazon S3 위치 구성:**

AWS Glue 데이터 카탈로그 또는 AWS Glue ETL에서 데이터 품질 작업을 실행할 때 Amazon S3 위치를 제공하여 데이터 품질 결과를 Amazon S3에 쓸 수 있습니다. 아래 구문을 통해 데이터 품질 결과를 읽기 위해 대상을 참조하여 테이블을 생성할 수 있습니다.

`CREATE EXTERNAL TABLE` 및 `MSCK REPAIR TABLE` 쿼리는 별도로 실행해야 합니다.

```
CREATE EXTERNAL TABLE <my_table_name>(
    catalogid string,
    databasename string,
    tablename string,
    dqrunid string,
    evaluationstartedon timestamp,
    evaluationcompletedon timestamp,
    rule string,
    outcome string,
    failurereason string,
    evaluatedmetrics string) 
PARTITIONED BY (
    `year` string,
    `month` string,
    `day` string)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
WITH SERDEPROPERTIES (
    'paths'='catalogId,databaseName,dqRunId,evaluatedMetrics,evaluationCompletedOn,evaluationStartedOn,failureReason,outcome,rule,tableName')
STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION 's3://glue-s3-dq-bucket-us-east-2-results/'
TBLPROPERTIES (
    'classification'='json',
    'compressionType'='none',
    'typeOfData'='file');
```

```
MSCK REPAIR TABLE <my_table_name>;
```

위 테이블을 생성한 후에 Amazon Athena를 사용하여 분석 쿼리를 실행할 수 있습니다.

## AWS CloudFormation을 사용하여 데이터 품질 규칙 배포
<a name="data-quality-deploy-cfn"></a>

AWS CloudFormation을 사용하여 데이터 품질 규칙을 생성할 수 있습니다. 자세한 내용은 [AWS Glue에 대한 AWS CloudFormation](https://docs.aws.amazon.com/glue/latest/dg/populate-with-cloudformation-templates.html)을 참조하세요.

## 데이터 품질 규칙 예약
<a name="data-quality-scheduling-rules"></a>

다음 방법을 사용하여 데이터 품질 규칙을 예약할 수 있습니다.
+  데이터 카탈로그에서 데이터 품질 규칙을 예약합니다. 코드를 사용하지 않는 사용자도 이 옵션을 사용하여 데이터 품질 검사를 쉽게 예약할 수 있습니다. AWS Glue Data Quality는 Amazon EventBridge에서 예약을 생성합니다. 데이터 품질 규칙을 예약하려면: 
  +  규칙 세트로 이동한 다음 **실행**을 클릭합니다.
  +  **실행 빈도**에서 원하는 예약을 선택하고 **작업 이름**을 제공합니다. 이 작업 이름은 EventBridge에서의 예약 이름입니다.
+ Amazon EventBridge 및 AWS Step Functions를 사용하여 데이터 품질 규칙에 대한 평가 및 권장 사항을 조정합니다.

# AWS Glue Data Quality의 저장 데이터 암호화
<a name="data-quality-encryption"></a>

 AWS Glue Data Quality는 기본적으로 암호화를 제공하여 민감한 고객 저장 데이터를 AWS 자체 암호화 키를 사용하여 보호합니다.

## AWS 소유 키
<a name="w2aac49c74b9"></a>

 AWS Glue Data Quality는 이러한 키를 사용하여 고객의 데이터 품질 자산을 자동으로 암호화합니다. 사용자는 AWS 소유 키를 확인, 관리 또는 사용하거나 사용을 감사할 수 없습니다. 하지만 데이터를 암호화하는 키를 보호하기 위해 어떤 작업을 수행하거나 어떤 프로그램을 변경할 필요가 없습니다. 자세한 내용은 AWS KMS 개발자 가이드에서 [AWS 소유 키](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-owned-cmk)를 참조하세요.

 기본적으로 저장 데이터를 암호화하면 민감한 데이터 보호와 관련된 운영 오버헤드와 복잡성을 줄이는 데 도움이 됩니다. 동시에 엄격한 암호화 규정 준수 및 규제 요구 사항을 충족하는 안전한 애플리케이션을 구축할 수 있습니다.

 이 암호화 계층을 비활성화하거나 다른 암호화 유형을 선택할 수는 없지만 Data Quality 리소스를 생성할 때 고객 관리형 키를 선택하여 기존 AWS 소유 암호화 키에 두 번째 암호화 계층을 추가할 수 있습니다.

## 고객 관리형 키
<a name="data-quality-encryption-customer-managed-keys"></a>

 **고객 관리형 키**: AWS Glue Data Quality는 사용자가 생성하고 소유하고 관리하는 대칭형 고객 관리형 키를 사용하도록 지원합니다. 따라서 기존 AWS 소유 암호화에 두 번째 암호화 계층이 추가됩니다. 이 암호화 계층을 완전히 제어할 수 있으므로 다음과 같은 작업을 수행할 수 있습니다.
+  키 정책 수립 및 유지 
+  IAM 정책 수립 및 유지 
+  키 정책 활성화 및 비활성화 
+  키 암호화 자료 교체 
+  태그 추가 
+  키 별칭 만들기 
+  삭제를 위한 스케줄 키 

 자세한 내용은 AWS KMS Developer Guide의 [Customer managed keys](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk)를 참조하십시오.

 다음 표에는 AWS Glue Data Quality가 다양한 데이터 품질 자산을 암호화하는 방법이 요약되어 있습니다.


| 데이터 유형 | AWS 소유 키 암호화 | 고객 관리형 키 암호화 | 
| --- | --- | --- | 
|   **데이터 품질 규칙 세트**   영구 DQ 규칙 세트에서 참조하는 DQDL 규칙 세트 문자열입니다. 이러한 영구 규칙 세트는 현재 AWS Glue Data Catalog 환경에서만 사용됩니다.  | 활성화됨 | 활성화됨 | 
|   **데이터 품질 규칙/분석기 결과 **   규칙 세트에 있는 각 규칙의 통과/실패 상태와 규칙과 분석기 모두에서 수집한 지표를 포함하는 결과 아티팩트입니다.  | 활성화됨 | 활성화됨 | 
|   **관찰**   데이터에서 이상이 탐지되면 관찰 항목이 생성됩니다. 여기에는 예상 상한과 하한에 대한 정보와 이러한 한도를 기반으로 제안되는 규칙이 포함됩니다. 생성된 경우 Data Quality 결과와 함께 표시됩니다.  | 활성화됨 | 활성화됨 | 
|   **통계**   지표 값(예: RowCount, Completeness), 열 이름, 기타 메타데이터 등 지정된 규칙 세트로 데이터를 평가한 후 수집된 지표에 대한 정보를 포함합니다.  | 활성화됨 | 활성화됨 | 
|   **이상 탐지 통계 모델**   통계 모델에는 고객 데이터에 대한 이전 평가를 기반으로 생성된 특정 지표에 대한 상한과 하한의 시계열이 포함됩니다.  | 활성화됨 | 활성화됨 | 

**참고**  
 AWS Data Quality는 AWS 소유 키를 사용하여 저장된 데이터를 자동으로 암호화하여 개인 식별 데이터를 무료로 보호할 수 있습니다. 그러나 고객 관리형 키 사용에는 AWS KMS 비용이 부과됩니다. 요금에 대한 자세한 내용은 [AWS KMS 요금](https://aws.amazon.com/kms/pricing/) 부분을 참조하세요.  
 에 대한 자세한 설명은 AWS KMS 섹션을 참조하십시오..[AWS KMS](https://docs.aws.amazon.com/kms/latest/developerguide/overview.html)

## 고객 관리형 키 생성
<a name="data-quality-encryption-customer-managed-key"></a>

 AWS Management Console 또는 AWS KMS API를 사용하여 대칭형 고객 관리형 키를 만들 수 있습니다.

**대칭형 고객 관리형 키를 생성하려면**
+  자세한 내용은 AWS Key Management Service 개발자 가이드의 [대칭 암호화 AWS KMS 키 생성](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html#create-symmetric-cmk)의 단계를 따르세요.

### 키 정책
<a name="data-quality-encryption-customer-managed-key-policy"></a>

 키 정책은 고객 관리형 키에 대한 액세스를 제어합니다. 모든 고객 관리형 키에는 키를 사용할 수 있는 사람과 키를 사용하는 방법을 결정하는 문장이 포함된 정확히 하나의 키 정책이 있어야 합니다. 고객 관리형 키를 만들 때 키 정책을 지정할 수 있습니다. 자세한 내용은 AWS Key Management Service 개발자 가이드에서 [AWS KMS 키의 키 정책](https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html)을 참조하세요.

 Data Quality 리소스에서 고객 관리형 키를 사용하려면 키 정책에서 다음 API 작업을 허용해야 합니다.
+  [https://docs.aws.amazon.com/kms/latest/APIReference/API_Decrypt.html](https://docs.aws.amazon.com/kms/latest/APIReference/API_Decrypt.html) - `GenerateDataKeyWithoutPlaintext`를 사용하여 AWS KMS 키로 암호화된 사이퍼텍스트를 해독합니다.
+  [https://docs.aws.amazon.com/kms/latest/APIReference/API_DescribeKey.html](https://docs.aws.amazon.com/kms/latest/APIReference/API_DescribeKey.html) - Amazon Location에서 키의 유효성을 확인할 수 있도록 고객 관리형 키 세부 정보를 제공합니다.
+  [https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKeyWithoutPlaintext.html](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKeyWithoutPlaintext.html) - AWS KMS 외부에서 사용할 고유한 대칭 데이터 키를 반환합니다. 이 작업은 지정한 대칭 암호화 KMS 키로 암호화된 데이터 키를 반환합니다. 키의 바이트 수는 무작위이며 호출자 또는 KMS 키와는 무관합니다. 고객이 실행해야 하는 KMS 호출을 줄이는 데 사용됩니다.
+  [https://docs.aws.amazon.com/kms/latest/APIReference/API_ReEncrypt.html](https://docs.aws.amazon.com/kms/latest/APIReference/API_ReEncrypt.html) - 사이퍼텍스트를 해독한 다음 AWS KMS 내에서 완전히 다시 암호화합니다. 이 작업을 사용하여 데이터가 암호화되는 KMS 키를 변경할 수 있습니다. 예를 들어 KMS 키를 [수동으로 교체](https://docs.aws.amazon.com/kms/latest/developerguide/rotate-keys.html#rotate-keys-manually)하거나 암호문을 보호하는 KMS 키를 변경할 수 있습니다. 또한 사이퍼텍스트의 [암호화 컨텍스트](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#encrypt_context)를 변경하는 등 동일한 KMS 키로 암호문을 다시 암호화하는 데에도 사용할 수 있습니다.

 다음은 Amazon Location에 추가할 수 있는 정책 설명 예시입니다.

```
"Statement" : [ 
    {
        "Sid" : "Allow access to principals authorized to use AWS Glue Data Quality",
        "Effect" : "Allow",
        "Principal" : {
            "AWS": "arn:aws:iam::<account_id>:role/ExampleRole"
        },
        "Action" : [ 
            "kms:Decrypt", 
            "kms:DescribeKey",
            "kms:GenerateDataKeyWithoutPlaintext",
            "kms:ReEncrypt*"
        ],
        "Resource" : "*",
        "Condition" : {
            "StringEquals" : {
                "kms:ViaService" : "glue.amazonaws.com",
                "kms:CallerAccount" : "111122223333"
            }
        },
    {
        "Sid": "Allow access for key administrators",
        "Effect": "Allow",
        "Principal": {
            "AWS": "arn:aws:iam::111122223333:root"
          },
        "Action" : [ 
            "kms:*"
         ],
        "Resource": "arn:aws:kms:region:111122223333:key/key_ID"
    },
    {
        "Sid" : "Allow read-only access to key metadata to the account",
        "Effect" : "Allow",
        "Principal" : {
            "AWS" : "arn:aws:iam::111122223333:root"
        },
        "Action" : [ 
            "kms:Describe*",
            "kms:Get*",
            "kms:List*",
        ],
        "Resource" : "*"
    }
]
```

### AWS Glue Data Quality의 KMS 키 사용에 관한 참고 사항
<a name="data-quality-encryption-kms-keys-notes"></a>

 AWS Glue Data Quality는 키 전환을 지원하지 않습니다. 즉, A 키로 데이터 품질 자산을 암호화하고 B 키로 전환하면, B 키를 사용하기 위해 A 키로 암호화된 데이터를 다시 암호화하지 않습니다. 어쨌든 B 키로 전환할 수는 있지만 이전에 A 키로 암호화된 데이터에 액세스하려면 A 키에 대한 액세스 권한을 유지해야 합니다.

 정책의 권한 지정에 대한 자세한 내용은 AWS Key Management Service 개발자 가이드에서 [키 정책의 AWS 서비스에 대한 권한](https://docs.aws.amazon.com/kms/latest/developerguide/key-policy-services.html)을 참조하세요.

 키 액세스 관련 문제 해결에 대한 내용은 AWS Key Management Service 개발자 가이드에서 [키 액세스 문제 해결](https://docs.aws.amazon.com/kms/latest/developerguide/policy-evaluation.html)을 참조하세요.

## 보안 구성 생성
<a name="data-quality-encryption-create-security-configuration"></a>

 AWS Glue의 [보안 구성 리소스](encryption-security-configuration.md)에는 암호화된 데이터를 쓸 때 필요한 속성이 포함되어 있습니다.

**데이터 품질 자산을 암호화하려면:**

1.  **암호화 설정**의 **고급 설정**에서 **데이터 품질 암호화 활성화**를 선택합니다.

1.  KMS 키를 선택하거나 **AWS KMS 키 생성**을 선택합니다.

![\[이 스크린샷은 보안 구성 추가 페이지를 보여줍니다. DataQuality 암호화 활성화 옵션이 선택되었습니다.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/data-quality-add-security-configuration.png)


## AWS Glue Data Quality 암호화 컨텍스트
<a name="data-quality-encryption-context"></a>

 [암호화 컨텍스트](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#encrypt_context)는 데이터에 대한 추가 컨텍스트 정보를 포함하는 선택적 키-값 페어 세트입니다.

 AWS KMS는 암호화 컨텍스트를 [추가 인증 데이터](https://docs.aws.amazon.com/crypto/latest/userguide/cryptography-concepts.html#term-aad)로 사용하여 [인증된 암호화](https://docs.aws.amazon.com/crypto/latest/userguide/cryptography-concepts.html#term-aad)를 지원합니다. 데이터 암호화 요청에 암호화 컨텍스트를 포함하는 경우, AWS KMS는 암호화된 데이터에 암호화 컨텍스트를 바인딩합니다. 데이터 복호화를 위해, 이 요청에 동일한 암호화 컨텍스트를 포함합니다.

### AWS Glue Data Quality 암호화 컨텍스트 예
<a name="data-quality-encryption-context-example"></a>

```
"encryptionContext": {
    "kms-arn": "arn:aws:kms:us-east-1:111122223333:key/1234abcd-12ab-34cd-56ef-123456SAMPLE",
    "branch-key-id": "111122223333+arn:aws:kms:us-east-1:111122223333:key/1234abcd-12ab-34cd-56ef-123456SAMPLE",
    "hierarchy-version": "1",
    "aws-crypto-ec:aws:glue:securityConfiguration": "111122223333:customer-security-configuration-name",
    "create-time": "2024-06-07T13:47:23:000861Z",
    "tablename": "AwsGlueMlEncryptionKeyStore",
    "type": "beacon:ACTIVE"
}
```

### 모니터링을 위한 암호화 컨텍스트 사용
<a name="data-quality-encryption-context-monitoring"></a>

 대칭형 고객 관리 키를 사용하여 트래커 또는 지오펜스 컬렉션을 암호화하는 경우 감사 기록 및 로그의 암호화 컨텍스트를 사용하여 고객 관리 키가 사용되는 방식을 식별할 수도 있습니다. 암호화 컨텍스트는 AWS CloudTrail 또는 Amazon CloudWatch Logs에서 생성되는 로그에도 나타납니다.

## AWS Glue Data Quality의 암호화 키 모니터링
<a name="data-quality-monitoring-encryption-keys"></a>

 AWS KMS 고객 관리형 키를 AWS Glue Data Quality 리소스에 사용하는 경우 AWS CloudTrail 또는 Amazon CloudWatch Logs를 사용하여 AWS Glue Data Quality가 AWS KMS에 보내는 요청을 추적할 수 있습니다.

 다음은 AWS Glue Data Quality에서 고객 관리 키로 암호화된 데이터에 액세스하기 위해 직접적으로 호출한 KMS 운영을 모니터링하기 위한 `GenerateDataKeyWithoutPlainText` 및 `Decrypt`의 AWS CloudTrail 이벤트입니다.

 **Decrypt** 

```
{
    "eventVersion": "1.09",
    "userIdentity": {
        "type": "AssumedRole",
        "arn": "arn:aws:sts::111122223333:role/CustomerRole",
        "accountId": "111122223333",
        "invokedBy": "glue.amazonaws.com"
    },
    "eventTime": "2024-07-02T20:03:10Z",
    "eventSource": "kms.amazonaws.com",
    "eventName": "Decrypt",
    "awsRegion": "us-east-1",
    "sourceIPAddress": "glue.amazonaws.com",
    "userAgent": "glue.amazonaws.com",
    "requestParameters": {
        "keyId": "arn:aws:kms:us-east-1:111122223333:key/1234abcd-12ab-34cd-56ef-123456SAMPLE",
        "encryptionAlgorithm": "SYMMETRIC_DEFAULT",
        "encryptionContext": {
            "kms-arn": "arn:aws:kms:us-east-1:111122223333:key/1234abcd-12ab-34cd-56ef-123456SAMPLE",
            "branch-key-id": "111122223333+arn:aws:kms:us-east-1:111122223333:key/1234abcd-12ab-34cd-56ef-123456SAMPLE",
            "hierarchy-version": "1",
            "aws-crypto-ec:aws:glue:securityConfiguration": "111122223333:customer-security-configuration-name",
            "create-time": "2024-06-07T13:47:23:000861Z",
            "tablename": "AwsGlueMlEncryptionKeyStore",
            "type": "branch:ACTIVE",
            "version": "branch:version:ff000af-00eb-00ce-0e00-ea000fb0fba0SAMPLE"
        }
    },
    "responseElements": null,
    "requestID": "ff000af-00eb-00ce-0e00-ea000fb0fba0SAMPLE",
    "eventID": "ff000af-00eb-00ce-0e00-ea000fb0fba0SAMPLE",
    "readOnly": true,
    "resources": [
        {
            "accountId": "111122223333",
            "type": "AWS::KMS::Key",
            "ARN": "arn:aws:kms:us-east-1:111122223333:key/1234abcd-12ab-34cd-56ef-123456SAMPLE"
        }
    ],
    "eventType": "AwsApiCall",
    "managementEvent": true,
    "recipientAccountId": "111122223333",
    "eventCategory": "Management"
}
```

 **GenerateDataKeyWithoutPlaintext** 

```
{
    "eventVersion": "1.09",
    "userIdentity": {
        "type": "AssumedRole",
        "arn": "arn:aws:sts::111122223333:role/CustomerRole",
        "accountId": "111122223333",
        "invokedBy": "glue.amazonaws.com"
    },
    "eventTime": "2024-07-02T20:03:10Z",
    "eventSource": "kms.amazonaws.com",
    "eventName": "GenerateDataKeyWithoutPlaintext",
    "awsRegion": "us-east-1",
    "sourceIPAddress": "glue.amazonaws.com",
    "userAgent": "glue.amazonaws.com",
    "requestParameters": {
        "keyId": "arn:aws:kms:us-east-1:111122223333:key/1234abcd-12ab-34cd-56ef-123456SAMPLE",
        "encryptionAlgorithm": "SYMMETRIC_DEFAULT",
        "encryptionContext": {
            "kms-arn": "arn:aws:kms:us-east-1:111122223333:key/1234abcd-12ab-34cd-56ef-123456SAMPLE",
            "branch-key-id": "111122223333+arn:aws:kms:us-east-1:111122223333:key/1234abcd-12ab-34cd-56ef-123456SAMPLE",
            "hierarchy-version": "1",
            "aws-crypto-ec:aws:glue:securityConfiguration": "111122223333:customer-security-configuration-name",
            "create-time": "2024-06-07T13:47:23:000861Z",
            "tablename": "AwsGlueMlEncryptionKeyStore",
            "type": "branch:version:ff000af-00eb-00ce-0e00-ea000fb0fba0SAMPLE"
        }
    },
    "responseElements": null,
    "requestID": "ff000af-00eb-00ce-0e00-ea000fb0fba0SAMPLE",
    "eventID": "ff000af-00eb-00ce-0e00-ea000fb0fba0SAMPLE",
    "readOnly": true,
    "resources": [
        {
            "accountId": "111122223333",
            "type": "AWS::KMS::Key",
            "ARN": "arn:aws:kms:us-east-1:111122223333:key/1234abcd-12ab-34cd-56ef-123456SAMPLE"
        }
    ],
    "eventType": "AwsApiCall",
    "managementEvent": true,
    "recipientAccountId": "111122223333",
    "eventCategory": "Management"
}
```

 **ReEncyrpt** 

```
{
    "eventVersion": "1.09",
    "userIdentity": {
        "type": "AssumedRole",
        "arn": "arn:aws:sts::111122223333:role/CustomerRole",
        "accountId": "111122223333",
        "invokedBy": "glue.amazonaws.com"
    },
    "eventTime": "2024-07-17T21:34:41Z",
    "eventSource": "kms.amazonaws.com",
    "eventName": "ReEncrypt",
    "awsRegion": "us-east-1",
    "sourceIPAddress": "glue.amazonaws.com",
    "userAgent": "glue.amazonaws.com",
    "requestParameters": {
        "destinationEncryptionContext": {
             "kms-arn": "arn:aws:kms:us-east-1:111122223333:key/1234abcd-12ab-34cd-56ef-123456SAMPLE",
            "branch-key-id": "111122223333+arn:aws:kms:us-east-1:111122223333:key/1234abcd-12ab-34cd-56ef-123456SAMPLE",
            "hierarchy-version": "1",
            "aws-crypto-ec:aws:glue:securityConfiguration": "111122223333:customer-security-configuration-name",
            "create-time": "2024-06-07T13:47:23:000861Z",
            "tablename": "AwsGlueMlEncryptionKeyStore",
            "type": "branch:ACTIVE"
            "version": "branch:version:12345678-SAMPLE"
        },
        "destinationKeyId": "arn:aws:kms:us-east-1:111122223333:key/1234abcd-12ab-34cd-56ef-123456SAMPLE",
        "sourceAAD": "1234567890-SAMPLE+Z+lqoYOHj7VtWxJLrvh+biUFbliYDAQkobM=",
        "sourceKeyId": "arn:aws:kms:ap-southeast-2:585824196334:key/17ca05ca-a8c1-40d7-b7fd-30abb569a53a",
        "destinationEncryptionAlgorithm": "SYMMETRIC_DEFAULT",
        "sourceEncryptionContext": {
            "kms-arn": "arn:aws:kms:us-east-1:111122223333:key/1234abcd-12ab-34cd-56ef-123456SAMPLE",
            "branch-key-id": "111122223333+arn:aws:kms:us-east-1:111122223333:key/1234abcd-12ab-34cd-56ef-123456SAMPLE",
            "hierarchy-version": "1",
            "aws-crypto-ec:aws:glue:securityConfiguration": "111122223333:customer-security-configuration-name",
            "create-time": "2024-06-07T13:47:23:000861Z",
            "tablename": "AwsGlueMlEncryptionKeyStore",
            "type": "branch:version:ff000af-00eb-00ce-0e00-ea000fb0fba0SAMPLE"
        },
        "destinationAAD": "1234567890-SAMPLE",
        "sourceEncryptionAlgorithm": "SYMMETRIC_DEFAULT"
    },
    "responseElements": null,
    "requestID": "ff000af-00eb-00ce-0e00-ea000fb0fba0SAMPLE",
    "eventID": "ff000af-00eb-00ce-0e00-ea000fb0fba0SAMPLE",
    "readOnly": true,
    "resources": [
        {
            "accountId": "111122223333",
            "type": "AWS::KMS::Key",
            "ARN": "arn:aws:kms:us-east-1:111122223333:key/1234abcd-12ab-34cd-56ef-123456SAMPLE"
        },
        {
            "accountId": "111122223333",
            "type": "AWS::KMS::Key",
            "ARN": "arn:aws:kms:us-east-1:111122223333:key/1234abcd-12ab-34cd-56ef-123456SAMPLE"
        }
    ],
    "eventType": "AwsApiCall",
    "managementEvent": true,
    "recipientAccountId": "111122223333",
    "eventCategory": "Management"
}
```

## 자세히 알아보기
<a name="data-quality-encryption-learn-more"></a>

 다음 리소스에서 키에 대한 추가 정보를 확인할 수 있습니다.
+  [AWS Key Management Service 기본 개념](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html)에 대한 자세한 내용은 AWS Key Management Service 개발자 가이드를 참조하세요.
+  [AWS Key Management Service의 보안 모범 사례](https://docs.aws.amazon.com/kms/latest/developerguide/best-practices.html)에 대한 자세한 내용은 AWS Key Management Service 개발자 가이드를 참조하세요.

# 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: 기본 데이터베이스의 존재를 확인할 수 없음](#data-quality-trouble-error-7)
+ [오류 메시지: Provided key map not suitable for given data frames](#data-quality-trouble-error-8)
+ [사용자 클래스에서 예외: java.lang.RuntimeException: 데이터를 가져오지 못했습니다. 자세한 내용은 CloudWatch의 로그를 확인하세요.](#data-quality-trouble-error-9)
+ [시작 오류: 버킷에 대해 S3에서 다운로드하는 중 오류 발생](#data-quality-trouble-error-10)
+ [InvalidInputException(상태: 400): 데이터 품질 규칙을 구문 분석할 수 없음](#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\$1ERROR; IllegalArgumentException: Parsing Error: No rules or analyzers provided., no viable alternative at input](#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을 실행할 때 발생합니다. AWS Glue 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\$1sdg\$1involvement (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\$1end\$1time, primary.data\$1start\$1time, primary.end\$1time, primary.last\$1updated, primary.message, primary.process\$1date, primary.rowhash, primary.run\$1by, primary.run\$1id, primary.start\$1time, 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>

**오류 조건**: 내 규칙 세트는 성공했지만 전체 규칙 상태는 실패입니다.

**해결 방법**: 이 오류는 게시하는 동안 Amazon CloudWatch에 지표를 게시하는 옵션을 선택했기 때문에 발생했을 수 있습니다. 데이터 세트가 VPC에 있는 경우 VPC는 AWS Glue에서 Amazon CloudWatch에 지표를 게시하는 것을 허용하지 않을 수 있습니다. 이 경우 VPC에서 Amazon CloudWatch에 액세스할 수 있도록 엔드포인트를 설정해야 합니다.

## AnalysisException: 기본 데이터베이스의 존재를 확인할 수 없음
<a name="data-quality-trouble-error-7"></a>

 **오류 조건**: AnalysisException: 기본 데이터베이스의 존재를 확인할 수 없음: com.amazonaws.services.glue.model.AccessDeniedException: 기본에서 Lake Formation 권한 부족(서비스: AWS Glue, 상태 코드: 400, 오류 코드: AccessDeniedException, 요청 ID: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX, 프록시: null) 

**해결 방법**: AWS Glue 작업의 카탈로그 통합에서 AWS Glue는 항상 기본 데이터베이스의 존재 여부와 AWS Glue `GetDatabase API`의 사용 여부를 확인하려고 합니다. `DESCRIBE` Lake Formation 권한이 부여되지 않거나 `GetDatabase IAM` 권한이 부여되면 기본 데이터베이스의 존재를 확인할 때 작업에 실패합니다.

 이 문제를 해결하려면: 

1.  Lake Formation에서 기본 데이터베이스에 대한 `DESCRIBE` 권한을 추가합니다.

1.  Lake Formation에서 데이터베이스 생성자로 AWS Glue 작업에 연결된 IAM 역할을 구성합니다. 그러면 자동으로 기본 데이터베이스가 생성되고 역할에 필요한 Lake Formation 권한이 부여됩니다.

1.  `--enable-data-catalog` 옵션을 비활성화합니다. (이는 AWS Glue Studio에서 **Hive 메타스토어로 Data Catalog 사용**으로 표시됩니다.) 

   작업에 Spark SQL Data Catalog 통합이 필요하지 않은 경우 이를 비활성화할 수 있습니다.

## 오류 메시지: Provided key map not suitable for given data frames
<a name="data-quality-trouble-error-8"></a>

 **오류 조건**: 제공된 키 맵이 해당 데이터 프레임에 적합하지 않습니다.

 **해결 방법**: **DataSetMatch** 규칙 유형을 사용하고 있으며 조인 키가 중복되었습니다. 조인 키는 고유해야 하며 NULL이 아니어야 합니다. 고유한 조인 키를 사용할 수 없는 경우에는 **AggregateMatch**와 같은 다른 규칙 유형을 사용하여 요약 데이터와 일치시키는 것이 좋습니다.

## 사용자 클래스에서 예외: java.lang.RuntimeException: 데이터를 가져오지 못했습니다. 자세한 내용은 CloudWatch의 로그를 확인하세요.
<a name="data-quality-trouble-error-9"></a>

 **오류 조건**: 사용자 클래스에서 예외: java.lang.RuntimeException: 데이터를 가져오지 못했습니다. 자세한 내용은 CloudWatch의 로그를 확인하세요.

 **해결 방법**: 이 문제는 Amazon S3 기반 테이블에서 Amazon RDS 또는 Amazon Redshift와 비교되는 DQ 규칙을 생성할 때 발생합니다. 이 경우에는 AWS Glue에서 연결을 로드할 수 없습니다. 대신 Amazon Redshift 또는 Amazon RDS 데이터 세트에 DQ 규칙을 설정하세요. 이는 알려진 버그입니다.

## 시작 오류: 버킷에 대해 S3에서 다운로드하는 중 오류 발생
<a name="data-quality-trouble-error-10"></a>

 **오류 조건**: 시작 오류: 버킷에 대해 S3에서 다운로드하는 중 오류 발생: `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>/*"
}
```

 자세한 권한은 [데이터 품질 권한 부여](https://docs.aws.amazon.com/glue/latest/dg/data-quality-authorization.html)를 참조하세요. 이 라이브러리는 데이터 세트의 데이터 품질을 평가하는 데 필요합니다.

## InvalidInputException(상태: 400): 데이터 품질 규칙을 구문 분석할 수 없음
<a name="data-quality-trouble-error-11"></a>

 **오류 조건**: InvalidInputException(상태: 400): 데이터 품질 규칙을 구문 분석할 수 없습니다.

 **해결 방법**: 이 오류에는 여러 가지 가능성이 있습니다. 한 가지 가능성으로, 규칙에 작은따옴표가 포함되었을 수 있습니다. 큰따옴표로 묶여 있는지 확인합니다. 예제: 

```
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에서 사용자가 설정한 일정에 따라 AWS Glue Data Quality 작업을 트리거하지 않습니다.

 **해결 방법**: 작업을 트리거하는 역할에 적절한 권한이 없을 수 있습니다. 작업을 시작하는 데 사용하는 역할에 [평가 실행 예약에 필요한 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)`는 현재 행 수와 유의미하게 비교할 수 없는 목록을 생성하기 때문입니다.

 **해결 방법**: 집계 함수를 사용하여 목록 값 피연산자를 단일 숫자로 줄입니다.

**오류 조건**:
+  `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개를 검색합니다.

 **해결 방법**: 현재 작업 실행에서 관찰된 값과 유의미한 비교를 수행하려면 집계 함수를 사용하여 이러한 값을 단일 숫자로 줄여야 합니다.

유효한 예:
+ `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` 집계 함수를 사용하여 목록에서 하나의 기록 값을 선택할 수 있습니다. 예를 들어 `RowCount > index(last(5)`, 1)은 현재 작업에서 관찰된 행 수가 해당 작업에서 관찰된 두 번째로 최근 행 수보다 확실하게 큰지 여부를 확인합니다. `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 데이터 카탈로그에서 Apache Iceberg를 사용 중이고 AWS Glue 데이터 카탈로그의 입력 형식 속성이 비어 있습니다.

 **해결 방법**: 이 문제는 DQ 규칙에서 CustomSQL 레이블 유형을 사용할 때 발생합니다. 이 문제를 해결하는 한 가지 방법은 ‘기본’을 사용하거나 카탈로그 이름 `glue_catalog.`를 `<database>.<table> in Custom ruletype`으로 추가하는 것입니다.

## UNCLASSIFIED\$1ERROR; IllegalArgumentException: Parsing Error: No rules or analyzers provided., no viable alternative at input
<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
```