그룹별 데이터 품질 검사 적용

그룹별 데이터 품질 검사 적용

Enterprise Edition 기능 — 데이터 품질 모니터링(Data Quality Monitoring)은 Enterprise Edition이 필요해요. 업그레이드 문의는 Snowflake 지원에 연락해 주세요.

데이터 메트릭 함수(DMF)를 테이블 또는 뷰와 연결하면 DMF는 데이터를 평가해 전체 컬럼 또는 테이블에 대한 단일 스칼라 값을 반환하며, 이는 전역 수준에서 데이터 상태를 추적하는 데 유용해요. 일부 사용 사례는 같은 메트릭을 차원별로 세분화해야 해요. 예를 들어 리전별 null 개수 또는 제품 범주별 중복 개수 같은 것이에요.

WITHIN GROUP 절을 사용하면 DMF 연결을 만들 때 데이터를 분할할 하나 이상의 컬럼을 지정할 수 있어서, 각 그룹이 자체 메트릭 결과를 얻을 수 있어요.

출처: Documentation

본문

개요

WITHIN GROUP 절로 DMF 연결을 만들면 그룹화 컬럼의 값의 각 고유 조합에 대해 DMF가 별도로 평가돼요. 결과는 데이터 품질 모니터링 결과 뷰에 그룹당 한 행으로 기록되며, 특정 세그먼트 안의 품질 문제를 더 쉽게 식별할 수 있게 해줘요.

예를 들어 customer_data 테이블에 여러 리전의 데이터가 있고 리전별 null 개수를 추적하려면 NULL_COUNT DMF를 region 컬럼으로 그룹화할 수 있어요. 모든 리전에 걸친 단일 개수를 얻는 대신 결과에서 리전당 한 행을 얻어요.

지원되는 DMF

WITHIN GROUP 절은 SNOWFLAKE.CORE 스키마의 대부분의 시스템 DMF(NULL_COUNT, DUPLICATE_COUNT, ROW_COUNT 포함)와 대부분의 사용자 지정 DMF에서 지원돼요.

WITHIN GROUP과 함께 지원되지 않는 시스템 DMF는 다음과 같아요.

  • FRESHNESS — 테이블 전체에 대해 동작하고 컬럼 인자를 받지 않기 때문.
  • REFERENTIAL_INTEGRITY_COUNT — 두 테이블을 조인하고 단일 그룹 안에서 평가할 수 없기 때문.

참고 — 일부 메트릭은 그룹 간에 가산(additive)적이지 않아요. 예를 들어 그룹별 AVG와 STDDEV는 테이블 수준 동등값으로 결합할 수 없어요. 그룹화된 결과를 해석할 때 이 점을 염두에 두세요.

사용자 지정 DMF 호환성

DMF 본문이 간단한 SQL 구조를 사용하면 사용자 지정 DMF가 지원돼요. 다음 표는 구조 유형별 호환성을 요약해요.

DMF 본문 구조 지원됨
단일 테이블 쿼리 예
하위 쿼리 예
FLATTEN 예
JOIN 아니요
공통 테이블 표현식(CTE) 아니요
UNION 또는 UNION ALL 아니요
DISTINCT 아니요
창 함수(Window Functions) 아니요

지원되지 않는 사용자 지정 DMF 구조와 함께 WITHIN GROUP을 사용하려고 하면 연결 생성 시 오류가 반환돼요.

팁 — 사용자 지정 DMF가 CTE, UNION, JOIN, DISTINCT 또는 창 함수 패턴을 사용한다면 하위 쿼리로 다시 작성하거나, 가능하면 동등한 시스템 DMF로 마이그레이션하는 것을 고려해요.

그룹화가 있는 연결 만들기

그룹 수준 결과가 있는 DMF 연결을 추가하려면 WITHIN GROUP 절과 함께 ALTER TABLE 명령을 사용해요. 이 절은 그룹화되지 않은 연결에 사용하는 것과 같은 ADD DATA METRIC FUNCTION 문법에 추가되므로 기존 연결 속성(EXPECTATION, EXECUTE AS ROLE 같은)을 계속 사용할 수 있어요.

ALTER TABLE <table_name>
  ADD DATA METRIC FUNCTION <dmf_name>
    ON ( <argument_column> [ , ... ] )
    WITHIN GROUP ( <group_col1> [ , <group_col2> ... ] )
    [ GROUP LIMIT <integer> ]
    [ ADD EXPECTATION <expectation_name> ( <expression> ) [ , ... ] ]
    [ EXECUTE AS ROLE <role_name> ]

GROUP LIMIT 절은 등호 없이 두 키워드이며, WITHIN GROUP 절 바로 뒤에 와야 해요.

ADD DATA METRIC FUNCTION에서 지원되는 전체 절 집합(ANOMALY_DETECTION, SENSITIVITY, 단일 문에서 추가 DMF 연결 포함)은 데이터 메트릭 함수 작업을 참고해요.

그룹화에 특정한 매개 변수

매개 변수 설명
WITHIN GROUP ( col [ , col ... ] ) 그룹화할 하나 이상의 컬럼. 이 컬럼 값의 각 고유 조합은 별도의 결과 행을 생성해요.
GROUP LIMIT integer 선택 사항. 평가당 허용되는 최대 그룹 수. 유효 값은 1~1000(기본값: 1000)이에요. 평가 시 고유 그룹 수가 이 한도를 초과하면 오류로 평가가 실패해요.

참고

  • DMF, 테이블, 컬럼 조합당 연결은 하나만 가질 수 있어요. 주어진 메트릭과 컬럼 조합에 대한 연결이 이미 존재하면 다른 그룹화로 두 번째 연결을 만들 수 없어요.
  • WITHIN GROUP 절이 있으면 ANOMALY_DETECTION이 자동으로 비활성화돼요. 자세한 내용은 제한 사항을 참고해요.

예제

다음 예제는 customer_data 테이블의 name 컬럼에서 region별로 세분화된 null 개수를 추적해요.

ALTER TABLE customer_data
  ADD DATA METRIC FUNCTION SNOWFLAKE.CORE.NULL_COUNT
    ON (name)
    WITHIN GROUP (region);

제품 범주별로도 그룹화하고 최대 500개의 그룹을 허용하려면:

ALTER TABLE customer_data
  ADD DATA METRIC FUNCTION SNOWFLAKE.CORE.NULL_COUNT
    ON (name)
    WITHIN GROUP (region, product_category)
    GROUP LIMIT 500;

그룹화된 연결 수정 또는 삭제

기존 ALTER TABLE ... MODIFY ... 명령을 사용해 그룹화된 연결의 다른 속성(일시 중지 또는 재개, 기대값 변경 같은)을 업데이트할 수 있어요. WITHIN GROUP 절은 연결 생성 시 설정되며 나중에 수정할 수 없어요.

기존 연결의 그룹화를 변경하려면 연결을 삭제하고 다시 만들어요.

그룹화된 연결을 삭제하려면 표준 삭제 문법을 사용해요. 변경이 필요 없어요.

ALTER TABLE customer_data
  DROP DATA METRIC FUNCTION SNOWFLAKE.CORE.NULL_COUNT
    ON (name);

그룹화된 결과 보기

그룹화된 DMF 결과는 표준 DMF 결과와 같은 뷰에서 사용할 수 있어요. 연결이 WITHIN GROUP을 사용하면 각 평가가 그룹당 하나의 결과 행을 생성해요.

DATA_QUALITY_MONITORING_RESULTS 뷰

평가 결과를 조회하려면 DATA_QUALITY_MONITORING_RESULTS 뷰를 사용해요. 그룹화된 결과에는 각 행이 해당하는 그룹을 식별하는 새 GROUP_BY_INFO 컬럼이 포함돼요.

컬럼 유형 설명
GROUP_BY_INFO ARRAY 각각 이 행의 하나의 그룹화 컬럼과 그 값을 설명하는 객체의 배열. 각 객체는 id, name, value를 포함해요. 그룹화되지 않은 연결에서는 빈 배열.

예제: 리전별 null 개수 조회

SELECT metric_name,
       value,
       group_by_info
  FROM SNOWFLAKE.LOCAL.DATA_QUALITY_MONITORING_RESULTS
  WHERE table_name = 'CUSTOMER_DATA'
    AND metric_name = 'NULL_COUNT'
  ORDER BY measurement_time DESC;

예제 출력:

+-------------+-------+----------------------------------------------------+
| METRIC_NAME | VALUE | GROUP_BY_INFO                                      |
+-------------+-------+----------------------------------------------------+
| NULL_COUNT  |    42 | [{"id":"7","name":"REGION","value":"US"}]          |
| NULL_COUNT  |     5 | [{"id":"7","name":"REGION","value":"EU"}]          |
| NULL_COUNT  |     3 | [{"id":"7","name":"REGION","value":"APAC"}]        |
+-------------+-------+----------------------------------------------------+

예제: 특정 그룹에 대한 결과 필터링

SELECT metric_name, value, measurement_time
  FROM SNOWFLAKE.LOCAL.DATA_QUALITY_MONITORING_RESULTS,
       LATERAL FLATTEN(input => group_by_info) f
  WHERE table_name = 'CUSTOMER_DATA'
    AND f.value:name::STRING = 'REGION'
    AND f.value:value::STRING = 'US';

예제: 같은 평가의 그룹 간 결과 비교

단일 평가의 모든 행은 같은 reference_id(연결 ID)와 measurement_time을 공유해요. 두 컬럼을 사용해 결과를 한 번의 평가 실행으로 범위를 한정해요.

SELECT f.value:name::STRING AS group_column,
       f.value:value::STRING AS group_value,
       value
  FROM SNOWFLAKE.LOCAL.DATA_QUALITY_MONITORING_RESULTS,
       LATERAL FLATTEN(input => group_by_info) f
  WHERE reference_id = '<your_reference_id>'
    AND measurement_time = '<measurement_time>';

그룹화 구성 보기

DATA_METRIC_FUNCTION_REFERENCES 테이블 함수

DATA_METRIC_FUNCTION_REFERENCES 테이블 함수는 PROPERTIES VARIANT 열을 통해 각 연결에 대한 그룹화 세부 정보를 노출해요. WITHIN GROUP에 특정한 두 키는 다음과 같아요.

필드 설명
properties:within_group WITHIN GROUP 절에서 사용된 컬럼 참조의 배열을 나타내는 JSON 인코딩 문자열이며, 형식은 "[{\"domain\":\"COLUMN\",\"id\":\"<id>\",\"name\":\"<col_name>\"}]"이에요. PARSE_JSON()을 적용해 문자열을 조회 가능한 배열로 변환해요. 그룹화가 구성되지 않으면 NULL.
properties:group_limit 이 연결의 최대 그룹 한도. 그룹화가 구성되지 않으면 NULL.

PROPERTIES 열에 포함된 키의 전체 목록은 DATA_METRIC_FUNCTION_REFERENCES를 참고해요.

예를 들어:

SELECT ref_entity_name,
       metric_name,
       PARSE_JSON(properties:within_group::STRING) AS within_group,
       properties:group_limit::NUMBER AS group_limit
  FROM TABLE(INFORMATION_SCHEMA.DATA_METRIC_FUNCTION_REFERENCES(
    REF_ENTITY_NAME => 'CUSTOMER_DATA',
    REF_ENTITY_DOMAIN => 'TABLE'));

예제 출력:

+-----------------+-------------+-------------------------------------------------+-------------+
| REF_ENTITY_NAME | METRIC_NAME | WITHIN_GROUP                                    | GROUP_LIMIT |
+-----------------+-------------+-------------------------------------------------+-------------+
| CUSTOMER_DATA   | NULL_COUNT  | [{"domain":"COLUMN","id":"7","name":"REGION"}]  |        1000 |
+-----------------+-------------+-------------------------------------------------+-------------+

DATA_METRIC_FUNCTION_REFERENCES 뷰는 같은 PROPERTIES 열을 노출해요.

특정 그룹에 대한 오류 행 추출

그룹화된 DMF가 품질 문제를 표시하면 특정 그룹의 결과에 기여한 원시 행을 검사하고 싶을 수 있어요. SYSTEM$DATA_METRIC_SCAN 함수는 스캔을 특정 그룹으로 필터링하는 선택적 WITHIN_GROUP_VALUES 인자를 받아요.

SELECT * FROM TABLE(SYSTEM$DATA_METRIC_SCAN(
  REF_ENTITY_NAME     => '<table_or_view>',
  METRIC_NAME         => '<dmf_name>',
  ARGUMENT_NAME       => '<column>',
  [ AT_TIMESTAMP      => '<timestamp>', ]
  [ WITHIN_GROUP_VALUES => '<json_object>' ]
));

인자

인자 설명
WITHIN_GROUP_VALUES 그룹화 컬럼 이름을 스캔하려는 특정 그룹 값에 매핑하는 JSON 객체. 예: '{"REGION": "US", "PRODUCT_CATEGORY": "Electronics"}'. 문자열과 숫자 값만 지원돼요. 이 인자를 생략하면 스캔은 그룹과 관계없이 모든 행을 반환해요.

예제: US 리전의 null 행 보기

SELECT * FROM TABLE(SYSTEM$DATA_METRIC_SCAN(
  REF_ENTITY_NAME     => 'CUSTOMER_DATA',
  METRIC_NAME         => 'snowflake.core.null_count',
  ARGUMENT_NAME       => 'NAME',
  WITHIN_GROUP_VALUES => '{"REGION": "US"}'));

이것은 name IS NULL이고 region = 'US'인 모든 행을 반환해요.

그룹화된 연결과 함께 기대값 사용

기대값은 그룹화된 DMF 연결에서 작동해요. 그룹화된 연결에 기대값이 정의되면 각 그룹에 대해 독립적으로 평가되고, 그룹별 결과가 이벤트 테이블에 기록돼요. 그룹별 기대값 결과를 검사하려면 각 행의 그룹을 식별하는 GROUP_BY_INFO 컬럼이 포함된 DATA_QUALITY_MONITORING_EXPECTATION_STATUS 뷰를 조회해요.

알림은 그룹별 결과와 다르게 동작해요. 단일 평가에 대해 Snowflake는 최악 그룹 값(모든 그룹의 최대 메트릭 값)을 기준으로 최대 하나의 알림을 발생시켜요. 적어도 하나의 그룹이 기대값을 위반하면 해당 평가에 대해 알림 하나를 받아요. 그룹별 위반 세부 정보는 후속 분석을 위해 여전히 이벤트 테이블에 기록돼요.

기대값을 온디맨드로 평가하려면 SYSTEM$EVALUATE_DATA_QUALITY_EXPECTATIONS를 사용해요. 그룹화된 연결의 경우 이 함수는 모든 그룹을 평가하고 각 그룹에 대해 한 행을 반환하며, 각 그룹은 GROUP_BY_VALUES 출력 컬럼에서 식별돼요. 특정 그룹 값의 기본 행을 검사하려면 WITHIN_GROUP_VALUES 인자와 함께 SYSTEM$DATA_METRIC_SCAN을 사용해요(특정 그룹에 대한 오류 행 추출 참고).

기대값에 대한 자세한 내용은 SQL로 기대값 사용을 참고해요.

제한 사항

  • 사용자 지정 DMF 호환성. WITHIN GROUP 절은 CTE, UNION, UNION ALL, JOIN, DISTINCT 또는 창 함수를 사용하는 사용자 지정 DMF에서 지원되지 않아요. 자세한 내용은 지원되는 DMF를 참고해요.
  • 스키마 수준 연결. WITHIN GROUP은 스키마 수준 DMF 연결(ALTER SCHEMA ... ADD DATA METRIC FUNCTION)에서 지원되지 않아요. 컬럼으로 그룹화하려면 테이블 또는 뷰 수준에서 연결을 만들어요.
  • DMF, 테이블, 컬럼 조합당 하나의 연결. 메트릭, 테이블, 컬럼 조합당 하나의 연결만 허용되므로 조합당 하나의 그룹화 구성만 가질 수 있어요.
  • 그룹 한도. GROUP LIMIT의 유효 값은 1~1000이며 기본값은 1000이에요. 평가 시 고유 그룹 수가 구성된 한도를 초과하면 평가가 실패하고 해당 실행에 대해 결과가 기록되지 않아요. 그룹화 컬럼의 카디널리티를 줄이거나 GROUP LIMIT을 최대 1000까지 올려 이 오류를 피해요.
  • 불변 그룹화 구성. 그룹화 컬럼과 그룹 한도는 연결이 만들어진 후 변경할 수 없어요. 연결을 삭제하고 다시 만들어 그룹화를 변경해요.
  • 이상 감지. 연결별 ANOMALY_DETECTION 속성과 SNOWFLAKE.CORE 스키마의 시스템 이상 DMF(이상 감지가 활성화된 ROW_COUNT, FRESHNESS 같은)는 WITHIN GROUP에서 지원되지 않아요. WITHIN GROUP 절이 있으면 ANOMALY_DETECTION 속성이 자동으로 비활성화돼요. 그룹에 대한 완전한 이상 감지 지원은 향후 릴리스에서 계획돼 있어요.

더 알아보기