DQDL 문서는 대소문자를 구분하고, Rules 라는 이름의 목록 안에 규칙을 쉼표로 나열한다.
Rules = [ RowCount > 1000, IsComplete "order_id", IsUnique "order_id", ColumnValues "status" in ["NEW", "PAID", "SHIPPED", "CANCELLED"], ColumnValues "amount" between 0 and 1000000, Completeness "customer_email" > 0.95, ColumnDataType "created_at" = "TIMESTAMP", DataFreshness "created_at" <= 24 hours, ReferentialIntegrity "customer_id" "customers.customer_id" >= 0.99, (IsComplete "coupon_code") or (ColumnValues "discount" = 0), ColumnValues "country" in ["KR", "JP", "US"] with threshold > 0.98]
문법 요소
의미
주의점
IsComplete vs Completeness
전부 채워졌는가 vs 채워진 비율
100% 를 요구할 수 없는 컬럼은 비율 규칙으로
between x and y
범위 검사
양 끝값은 포함하지 않는다
with threshold
조건에 맞는 값의 비율로 통과 판정
ColumnValues, ColumnDataType, CustomSql 에서만
and / or
규칙 결합(복합 규칙)
결합되는 각 규칙을 괄호로 감싼다
where "..."
SparkSQL 조건으로 대상 행을 걸러 평가
임계값이 있으면 where 가 with threshold 앞
CustomSql
SQL 결과로 판정
규칙으로 표현 못 하는 업무 규칙용
ReferentialIntegrity
기준 데이터셋에 값이 존재하는 비율
기준 데이터셋을 별칭으로 함께 넘겨야 한다
복합 규칙은 기본적으로 각 규칙을 테이블 전체에 대해 따로 평가한 뒤 결과를 결합한다. "행마다 A 이거나 B 이면 통과"라는 SQL 식 의미를 원하면 평가 방식을 행 단위(compositeRuleEvaluation.method = ROW)로 바꿔야 한다. 이것을 모르면 OR 규칙이 예상과 달리 실패한다.
동적 규칙은 임계값 자리에 과거 실행 결과를 넣는다. last(k) 가 직전 k 회의 값을 가리키고, k 가 2 이상이면 avg·min·max 같은 집계로 한 숫자로 줄여야 한다.
Analyzers 블록은 조건 없이 통계만 수집한다. 아직 규칙을 쓸 만큼 데이터를 모를 때 통계부터 쌓아 두고, 그 통계를 이상 탐지가 쓴다.
Rules = [ RowCount >= min(last(7)), # 최근 7회 중 가장 적었던 날보다 줄면 실패 DetectAnomalies "RowCount" # 과거 추세에서 벗어나면 실패]Analyzers = [ DistinctValuesCount "customer_id", Completeness "customer_email"]
고정 임계값(RowCount > 1000)은 데이터 양이 요일·계절에 따라 변하면 오탐을 내거나, 사업이 커진 뒤에는 아무것도 못 잡는다. 하루 100만 건 기준으로 만든 규칙은 평소 200만 건이 들어오게 된 뒤 25% 가 빠져도 통과한다.
규칙과 Analyzer 가 실행될 때마다 통계가 Glue 서비스 안에 쌓이고, 이상 탐지는 이 통계의 추세를 학습해 예상 범위(상한·하한)를 만든다. 실제 값이 범위를 벗어나면 관찰을 생성한다.
탐지에는 최소 세 개의 데이터 포인트가 필요하다. 처음 몇 번의 실행에서는 아무것도 나오지 않는다.
한 번 이상으로 잡힌 값은 따로 제외하지 않으면 다음 실행부터 정상값으로 학습에 들어간다. 장애로 생긴 값을 그대로 두면 같은 장애를 다시 못 잡는다. 통계 제외로 모델에 피드백을 준다.
탐지 모드는 둘이다. 추세·계절성을 따라가는 기본 모드(Linear)와, 시간 간격을 무시하고 기준선만 보는 모드(Fixed)다. 실행 간격이 불규칙하면 후자가 맞다.
과금은 탐지에 걸린 시간만큼이며 통계 하나마다 DPU 가 잡힌다. 통계 저장 자체는 무료다.
방식
기준
강점
약점
정적 규칙
사람이 정한 절대값
의미가 분명, 첫 실행부터 동작
성장·계절성에 취약
동적 규칙 last(k)
직전 k 회의 값
설명 가능, 규칙으로 실패 처리됨
요일 패턴은 못 봄
이상 탐지
학습한 추세·계절성
사람이 임계값을 몰라도 됨
초기 데이터 필요, 오염된 학습에 취약
💡 관련 이론: 이상 탐지는 "절대값이 틀렸다"가 아니라 "평소와 다르다"를 잡는다. CloudWatch Anomaly Detection 도 같은 발상으로 지표의 정상 범위를 학습한다. 차이는 대상이다. CloudWatch 는 운영 지표를, Glue Data Quality 는 데이터 자체의 통계를 본다.
행 단위 결과에는 DataQualityRulesPass, DataQualityRulesFail, DataQualityRulesSkip, DataQualityEvaluationResult 네 컬럼이 붙는다. 어떤 규칙 때문에 떨어졌는지가 행에 남으므로 격리 영역에 실패 사유와 함께 저장할 수 있다.
컬럼 존재 여부(ColumnExists)처럼 행 하나로는 판정할 수 없는 규칙은 행 단위 결과에서 건너뛴 규칙(DataQualityRulesSkip)으로 표시된다.