728x90
반응형
데이터 품질이란?
- 일반적인 문제
- Raw Data를 항상 신뢰할 수는 없다.
- 데이터 소스마다 품질 수준이 상이 하다.
- 대부분 데이터 레이크 설계시에 수집 데이터의 통제 수준을 결정하지 않기 때문에 위 문제가 발생 가능 하다.
- 문제로 인해 발생 가능한 이슈
- 누락된 값으로 인해 프로덕션 시스템에서 널이 아닌 값을 필요로 하는 오류(NullPointerException)가 발생할 수 있습니다.
- 데이터 분포의 변화로 인해 머신 러닝 모델에서 예기치 않은 출력이 발생할 수 있습니다.
- 잘못된 데이터의 집계는 잘못된 비즈니스 의사 결정으로 이어질 수 있습니다.
- 위 문제를 해결하기 위해 데이터 처리 파이프라인의 단계 중 하나로, 필요한 품질 검사를 구현해야 한다.
구분 | 내용 |
공통 품질 검사 항목 |
|
데이터 품질 흐름에 기타 고려 사항 |
|
Deequ 기술 조사
- Amazon에서 내부적으로 개발한 오픈 소스 데이터 품질 라이브러리인 Deequ
- Deequ는 Amazon에서 내부적으로 많은 대규모 프로덕션 데이터 세트의 품질을 검증하는 데 사용되고 있습니다. 데이터 세트 생산자는 데이터 품질 제약 조건을 추가하고 편집할 수 있습니다. 시스템은 정기적으로(데이터 세트의 새 버전이 나올 때마다) 데이터 품질 메트릭을 계산하고, 데이터 세트 생산자가 정의한 제약 조건을 검증하며, 성공할 경우 소비자에게 데이터 세트를 게시합니다. 오류가 발생하면 데이터 세트 게시를 중지하고 생산자에게 알림을 보내 조치를 취하도록 할 수 있습니다. 데이터 품질 문제가 소비자 데이터 파이프라인으로 전파되지 않으므로 그 파급 반경이 줄어듭니다.
Deequ 세부 지원 기능
<메트릭 계산>
- Deequ는 데이터 품질 메트릭, 즉 완전성, 최대값 또는 상관관계와 같은 통계를 계산합니다.
- Deequ는 Spark를 사용해 Amazon S3와 같은 소스에서 읽고, 최적화된 집계 쿼리 세트를 통해 메트릭 계산합니다.
- 데이터에서 계산된 원시 메트릭에 직접 액세스할 수 있습니다.
{Analysers}
Metric | Description | Usage Example |
ApproxCountDistinct | Approximate number of distinct value, computed with HyperLogLogPlusPlus sketches. | ApproxCountDistinct("review_id") |
ApproxQuantile | Approximate quantile of a distribution. | ApproxQuantile("star_rating", quantile = 0.5) |
ApproxQuantiles | Approximate quantiles of a distribution. | ApproxQuantiles("star_rating", quantiles = Seq(0.1, 0.5, 0.9)) |
Completeness | Fraction of non-null values in a column. | Completeness("review_id") |
Compliance | Fraction of rows that comply with the given column constraint. | Compliance("top star_rating", "star_rating >= 4.0") |
Correlation | Pearson correlation coefficient, measures the linear correlation between two columns. The result is in the range [-1, 1], where 1 means positive linear correlation, -1 means negative linear correlation, and 0 means no correlation. | Correlation("total_votes", "star_rating") |
CountDistinct | Number of distinct values. | CountDistinct("review_id") |
DataType | Distribution of data types such as Boolean, Fractional, Integral, and String. The resulting histogram allows filtering by relative or absolute fractions. | DataType("year") |
Distinctness | Fraction of distinct values of a column over the number of all values of a column. Distinct values occur at least once. Example: [a, a, b] contains two distinct values a and b, so distinctness is 2/3. | Distinctness("review_id") |
Entropy | Entropy is a measure of the level of information contained in an event (value in a column) when considering all possible events (values in a column). It is measured in nats (natural units of information). Entropy is estimated using observed value counts as the negative sum of (value_count/total_count) * log(value_count/total_count). Example: [a, b, b, c, c] has three distinct values with counts [1, 2, 2]. Entropy is then (-1/5*log(1/5)-2/5*log(2/5)-2/5*log(2/5)) = 1.055. | Entropy("star_rating") |
Maximum | Maximum value. | Maximum("star_rating") |
Mean | Mean value; null values are excluded. | Mean("star_rating") |
Minimum | Minimum value. | Minimum("star_rating") |
MutualInformation | Mutual information describes how much information about one column (one random variable) can be inferred from another column (another random variable). If the two columns are independent, mutual information is zero. If one column is a function of the other column, mutual information is the entropy of the column. Mutual information is symmetric and nonnegative. | MutualInformation(Seq("total_votes", "star_rating")) |
PatternMatch | Fraction of rows that comply with a given regular experssion. | PatternMatch("marketplace", pattern = raw"\w{2}".r) |
Size | Number of rows in a DataFrame. | Size() |
Sum | Sum of all values of a column. | Sum("total_votes") |
UniqueValueRatio | Fraction of unique values over the number of all distinct values of a column. Unique values occur exactly once; distinct values occur at least once. Example: [a, a, b] contains one unique value b, and two distinct values a and b, so the unique value ratio is 1/2. | UniqueValueRatio("star_rating") |
Uniqueness | Fraction of unique values over the number of all values of a column. Unique values occur exactly once. Example: [a, a, b] contains one unique value b, so uniqueness is 1/3. | Uniqueness("star_rating") |
from pydeequ.analyzers import *
analysisResult = AnalysisRunner(spark) \
.onData(df) \
.addAnalyzer(Size()) \
.addAnalyzer(Completeness("b")) \
.run()
analysisResult_df = AnalyzerContext.successMetricsAsDataFrame(spark, analysisResult)
analysisResult_df.show()
{Profile}
- 객체 : ColumnProfilerRunner
- 각 열별 분석 (열에 있는 널이 아닌 값의 비율, DataType, Type별 개수(Boolean : 0개, String : n개 etc..))
from pydeequ.profiles import *
result = ColumnProfilerRunner(spark) \
.onData(df) \
.run()
for col, profile in result.profiles.items():
print(profile)
<제약 조건 검증>
- 사용자는 검증할 데이터 품질 제약 조건 집합을 정의하는 데 집중할 수 있습니다.
- Deequ는 데이터에서 계산해야 할 필수 메트릭 집합을 도출하는 작업을 처리합니다.
- Deequ는 제약 조건 검증 결과가 포함된 데이터 품질 보고서를 생성합니다.
{Constraint Verification}
- 객체 : VerificationSuite
- 제약 조건에 부합하는지 여부를 DataFrame을 대상으로 검증하는 단계
제약 | 매개변수 | 시맨틱 |
차원 완전성 | ||
isComplete | 열 | 열에 누락된 값 확인 |
hasCompleteness | 열, udf | 열에서 누락된 값의 사용자 지정 유효성 검사 |
차원 일관성 | ||
isUnique | 열 | 열 중복 확인 |
hasUniqueness | 열, udf | 열의 고유 값 비율에 대한 사용자 지정 유효성 검사 |
hasDistinctness | 열, udf | 열의 고유 행 비율에 대한 사용자 지정 유효성 검사 |
isInRange | 열, 값 범위 | 유효한 범위에 있는 값의 일부에 대한 유효성 검사 |
hasConsistentType | 열 | 유형이 동일한 값의 가장 큰 부분에 대한 유효성 검사 |
isNonNegative | 열 | 숫자 열의 모든 값 음수 여부 확인 |
isLessThan | 열 | 첫 번째 열의 모든 값이 항상 두 번째 열보다 작은지의 여부 확인 |
satisfies | 제약조건 | 모든 행이 제약 조건과 일치하는지 여부 유효성 검증 |
satisfiesIf | 제약조건 | 첫 번째 술어와 일치하는 모든 행이 두 번째 술어와 일치하는지 여부 유효성 검증 |
hasPredictability | 열, 열, udf | 열 예측 가능성에 대한 사용자 정의 유효성 검사 |
통계 (차원 일관성을 확인하는 데 사용할 수 있음) | ||
hasSize | udf | 레코드 수의 사용자 지정 유효성 검사 |
hasTypeConsistency | 열, udf | 동일한 데이터 유형 값의 최대 부분에 대한 사용자 지정 유효성 검사 |
hastCountDistinct | 열 | 열에 있는 고유한 Null이 아닌 값의 수에 대한 사용자 지정 유효성 검사 |
hasApproxCountDistinct | 열, udf | 고유한 null이 아닌 값의 대략적인 수에 대한 사용자 지정 유효성 검사 |
hasMin | 열, udf | 열의 최소값에 대한 사용자 지정 유효성 검사 |
hasMax | 열, udf | 열의 최대 값에 대한 사용자 지정 유효성 검사 |
hasMean | 열, udf | 열의 평균값에 대한 사용자 지정 유효성 검사 |
hasStandardDeviation | 열, udf | 열의 표준 편차 값에 대한 사용자 지정 유효성 검사 |
hasApproxQuantile | 열, 분위수, udf | 열의 특정 분위 수에 대한 사용자 지정 유효성 검사 (근사치) |
hasEntropy | 열, udf | 열 엔트로피의 사용자 지정 유효성 검사 |
hasMutualInformation | 열 쌍, udf | 열 쌍의 상호 정보에 대한 사용자 지정 유효성 검사 |
hasHistogramValues | 열, udf | 열 히스토그램의 사용자 지정 유효성 검사 |
hasCorrelation | 열 쌍, udf | 열 쌍의 상관 관계에 대한 사용자 지정 유효성 검사 |
from pydeequ.checks import *
from pydeequ.verification import *
check = Check(spark, CheckLevel.Warning, "Review Check")
checkResult = VerificationSuite(spark) \
.onData(df) \
.addCheck(
check.hasSize(lambda x: x >= 3) \
.hasMin("b", lambda x: x == 0) \
.isComplete("c") \
.isUnique("a") \
.isContainedIn("a", ["foo", "bar", "baz"]) \
.isNonNegative("b")) \
.run()
checkResult_df = VerificationResult.checkResultsAsDataFrame(spark, checkResult)
checkResult_df.show()
<제약 조건 제안>
- 사용자 지정 데이터 품질 제약 조건을 직접 정의하거나 데이터를 프로파일링하여 유용한 제약 조건을 추론하는 자동화된 제약 조건 제안 방법을 사용할 수 있습니다.
{Constraint Suggestions}
from pydeequ.suggestions import *
suggestionResult = ConstraintSuggestionRunner(spark) \
.onData(df) \
.addConstraintRule(DEFAULT()) \
.run()
# Constraint Suggestions in JSON format
print(suggestionResult)
- Deequ는 Apache Spark를 기반으로 구현되며, 일반적으로 분산 파일 시스템이나 데이터 웨어하우스에 있는 대규모 데이터 세트(수십억 개의 행)에 맞게 확장할 수 있도록 설계되었음
- Deequ 제안 작업은 세 가지 주요 차원을 기반으로 제약 조건 생성
- 완전성 – null 값의 존재를 측정 (예 : isComplete(“gender”)또는isComplete(“name”)
- 일관성 – 데이터 유형 및 값 범위의 일관성 예 .isUnique(“id”)또는 isContainedIn(“gender”, Array(“female”,”male”))
- 통계 – 데이터의 일 변량 측정 기준 (예 : .hasMax(“Salary”, “90000”)또는.hasSize(_>=10)
Glue Data Quality 기술 조사
- Glue에 평가판으로 제공중인 서비스(아래 리전만 제공)
- 미국 동부(오하이오)
- 미국 동부(버지니아 북부)
- 미국 서부(오레건)
- 아시아 태평양(도쿄)
- 유럽(아일랜드)
- 남아메리카(상파울루)
- 오픈 소스 Deequ 프레임워크 기반으로 구축됨
- 데이터 품질을 평가하고 모니터링하는 데 도움이 되는 관리형 서버리스 환경을 제공
동작 방식
구분 | 내용 |
권장 데이터 품질 규칙 시작 |
|
데이터 품질 작업 실행 |
|
데이터 품질 결과 모니터링 및 검토 |
|
품질 규칙 정의 방법 |
|
DQDL
Rules = [
IsComplete "order-id",
IsUnique "order-id"
]
고려 사항
- 현재 평가판만 지원중
- AWS Glue Data Catalog용 AWS Glue 데이터 품질은 현재 Amazon S3 소스에서 작동 (현재 S3만 지원중)
- AWS Glue Data Quality는 ETL 작업에 대해 AWS Glue 3.0에서 작동(다른 버전 지원 안됨)
- Glue Data Quality는 Glue에서만 사용 가능함
참고 자료
728x90
반응형
'빅데이터' 카테고리의 다른 글
OpenTelemetry 알아보기!! (0) | 2023.12.14 |
---|---|
빅데이터 파일 형식 알아보기(Parquet, ORC, AVRO) (0) | 2023.05.03 |
[빅데이터] 데이터 플랫폼 스키마 관리 하기 (0) | 2023.04.04 |
[빅데이터] 메타데이터에 대해 알아보자 (0) | 2023.04.03 |
데이터 플랫폼 - 스토리지 설계 및 구축 방법 (0) | 2023.03.28 |