Snowflake에서 합성 데이터 사용하기

이 미리 보기에서는 합성 데이터를 생성하는 새로운 저장 프로시저(GENERATE_SYNTHETIC_DATA)를 소개합니다.

개요

Snowflake는 소스 테이블에서 합성 데이터 를 생성하여 소스 테이블과 열 수는 같지만 인공 데이터가 포함된 테이블을 생성할 수 있습니다. 합성 데이터를 사용하여 너무 민감하거나 기밀이거나 다른 사람과 공유하기에 제한이 있는 데이터를 공유하거나 테스트할 수 있습니다. 합성 데이터 세트는 열의 이름, 번호, 데이터 타입 등 소스 데이터 세트와 동일한 특성을 가지며 행 수는 같거나 더 적습니다. 특히 원본 데이터가 민감하고 권한이 없는 사용자가 액세스해서는 안 되는 경우, 합성 데이터를 사용하여 Snowflake에서 워크로드를 테스트하고 검증할 수 있습니다.

이점

통계적 일관성:

합성 데이터 세트는 원본 데이터 세트의 통계적 속성을 나타내므로 데이터 엔지니어가 실제 데이터 세트의 통계적 속성을 이해하는 데 도움이 됩니다. 그 후 데이터 엔지니어는 실제 데이터 세트에 기반한 솔루션을 테스트하고 검증할 수 있습니다.

제품 검증:

프로덕션 데이터 세트와 유사한 합성 데이터 세트를 통해 프로덕션 엔지니어는 프로덕션 환경을 테스트하고 검증할 수 있습니다. 그 결과 더욱 견고한 프로덕션 환경을 구축할 수 있습니다.

합성 데이터 알고리즘 정보

Snowflake는 알고리즘을 사용하여 원본 데이터 세트와 유사한 합성 데이터를 생성합니다. 이 알고리즘은 원본 데이터 세트를 사용하여 원본 데이터 세트와 동일한 통계적 속성을 가진 합성 데이터를 생성합니다. 이 알고리즘은 코퓰러를 활용하여 열 내부와 열 전체에 걸친 데이터 분포를 캡처합니다. 이 분포가 캡처되면 합성 데이터는 통계적으로 원본 데이터와 유사하지만 원본 데이터의 행에 대한 직접적인 참조나 링크가 없습니다.

Snowflake는 소스 열을 다음 유형 중 하나로 분류하며, 이는 합성 데이터가 생성되는 방식에 영향을 줍니다.

  • 조인 키 모든 데이터 타입이 될 수 있습니다. 조인 키 열은 사용자가 명시적으로 선언합니다. 단일 실행 중에 모든 테이블의 모든 조인 키에 대해 소스 데이터의 동일한 값에 대해 출력 데이터에 일관된 합성 값이 생성됩니다. 이를 통해 조인 쿼리를 실행하고 소스 데이터에 대해 동일한 쿼리를 실행할 때와 유사한 결과를 얻을 수 있습니다.

  • 통계 데이터: 숫자, 부울, 날짜, 시간 또는 타임스탬프 타입의 데이터입니다. 동일한 유형의 인공 값이 생성되며 출력 데이터의 통계적 분포가 유사합니다.

  • 범주형 문자열 몇 개의 고유값이 있는 문자열 열* 실제 값은 소스 데이터와 유사한 통계적 분포로 생성된 데이터에 사용됩니다.

  • 비범주 문자열 많은 고유 값이 있는 문자열 열*. 출력에서 삭제되었습니다.

* Few unique values means that the number of unique values is less than half the row count. Many unique values means that the number of unique values is more than half the row count.

합성 데이터 생성하기

SNOWFLAKE.DATA_PRIVACY.GENERATE_SYNTHETIC_DATA 저장 프로시저를 호출하여 하나 이상의 테이블에서 합성 데이터를 생성합니다. Snowflake는 저장 프로시저를 호출하는 역할에 소유권이 부여된 테이블을 자동으로 생성합니다. 출력 테이블은 입력 테이블과 동일한 열 수와 동일한 열 이름 및 데이터 타입을 갖습니다. 개인정보 필터를 활성화하거나 입력 테이블에 null 값이 있는 경우를 제외하고 출력 테이블의 행 수는 일반적으로 동일합니다(이 경우 출력 테이블의 행 수가 적을 수 있음).

통합 데이터에 대한 조인 쿼리 실행

종합 데이터에 대해 조인 쿼리를 실행할 계획이라면 조인할 모든 열을 조인 키 로 지정하십시오. 합성 생성기는 조인 키로 표시된 모든 열의 동일한 소스 값에서 동일한 합성 값을 생성합니다. 즉, 모든 조인 키 열에서 소스 값 “Europe”은 생성된 테이블에서 동일한 합성 값을 생성합니다.

종합 데이터에 대해 다중 테이블 조인 쿼리를 실행할 계획이라면 쿼리에 사용할 모든 테이블을 사용하여 GENERATE_SYNTHETIC_DATA 를 실행하고 조인 키로 사용할 열을 지정합니다. 조인 키로 지정된 열은 모든 테이블에서 동일한 소스 값에 대해 일관된 합성 값을 가지므로 이러한 쿼리가 합성 데이터와 원본 데이터에서 유사하게 작동합니다.

조인 키는 단일 실행 내에서 일관된 합성 값을 생성합니다. 프로시저를 두 번 실행하면 동일한 요청을 다시 실행하더라도 조인 키에 대해 동일한 키 값이 생성되지 않습니다.

합성 데이터 필터링하기

GENERATE_SYNTHETIC_DATA 저장 프로시저를 호출할 때 선택적으로 'privacy_filter': True 구성 선택 사항을 설정하여 출력 테이블에 개인정보 필터를 적용할 수 있습니다. 개인정보 필터는 행이 입력 데이터 세트와 너무 유사한 경우 출력 테이블에서 행을 제거합니다. 개인정보 보호 임계값은 가장 가까운 이웃 거리 비율(NNDR)과 가장 가까운 기록까지의 거리(DCR) 값을 사용하여 출력 테이블에서 행을 제거할지 여부를 결정합니다.

요구 사항

입력 테이블 요구 사항

테이블과 뷰 모두 소스 데이터로 지원됩니다. 프로시저 호출당 최대 5개의 입력 테이블을 지정할 수 있습니다.

합성 데이터를 생성하려면 입력 테이블 또는 뷰가 다음 요구 사항을 충족해야 합니다.

  • 최소 20개의 고유 행

  • 최대 100개 열

  • 최대 230만 개 행

  • 지원되는 데이터 타입은 다음과 같습니다. 지원되지 않는 데이터 타입의 열은 열의 모든 값에 대해 NULL 을 반환합니다.

    • 모든 숫자 유형(NUMBER, DECIMAL, FLOAT, INTEGER 등)

    • BOOLEAN

    • 모든 날짜 및 시간 유형(DATE, DATETIME, TIME, TIMESTAMP 등), TIMESTAMP_TZ 제외

    • STRING, VARCHAR, CHAR, CHARACTER, TEXT

      STRING 열에 있는 값의 절반 이상이 고유 값인 경우 개인정보 보호 문제로 인해 Snowflake는 출력 테이블에서 해당 값을 편집된 값으로 대체합니다.

액세스 제어 요구 사항

합성 데이터를 생성하려면 다음 각 권한을 가진 역할을 사용해야 합니다.

  • USAGE 를 쿼리에 사용할 웨어하우스에 클릭합니다.

  • SELECT 를 합성 데이터를 생성할 입력 테이블에 클릭합니다.

  • USAGE 를 입력 테이블이 포함된 데이터베이스와 스키마, 출력 테이블이 포함된 데이터베이스에 추가합니다.

  • CREATE TABLE 을 출력 테이블이 포함된 스키마에 추가합니다.

  • OWNERSHIP 을 출력 테이블에 추가합니다. 가장 간단한 방법은 출력 테이블이 생성되는 스키마에 OWNERSHIP 을 부여하는 것입니다. (그러나 누군가 이 스키마에 FUTURE GRANT 를 적용한 경우 테이블 소유권은 자동으로 재정의됩니다. 즉, GRANT OWNERSHIP ON FUTURE TABLES IN SCHEMA db.my_schema TO ROLE some_role 은 스키마 my_schema 에서 생성된 모든 새 테이블에 대해 OWNERSHIP 을 some_role 에 자동으로 부여합니다.)

모든 사용자는 SNOWFLAKE.DATA_PRIVACY.GENERATE_SYNTHETIC_DATA 저장 프로시저에 액세스할 수 있습니다. SNOWFLAKE.CORE_VIEWER 데이터베이스 역할에 부여된 PUBLIC 역할을 사용하여 액세스를 사용할 수 있습니다.

기타 요구 사항

이 기능을 사용하려면 Snowflake 계정에서 Anaconda 이용 약관 에 동의해야 합니다.

권장 사항

예제: 여러 테이블의 합성 데이터

이 예제에서는 Snowflake 샘플 데이터 데이터베이스 SNOWFLAKE_SAMPLE_DATA 를 사용합니다. 계정에 보이지 않는 경우 다음 명령을 사용하여 복사본을 만들 수 있습니다.

USE ROLE ACCOUNTADMIN;
CREATE or REPLACE DATABASE SNOWFLAKE_SAMPLE_DATA from share SFC_SAMPLES.SAMPLE_DATA;
Copy

여러 입력 테이블에서 합성 데이터를 생성하려면 다음 단계를 따르십시오.

  1. data_engineer 역할에 대한 액세스 제어를 만들고 구성하여 필요한 모든 오브젝트를 만들 수 있도록 합니다.

    USE ROLE ACCOUNTADMIN;
    CREATE OR REPLACE ROLE data_engineer;
    CREATE OR REPLACE DATABASE syndata_db;
    CREATE OR REPLACE WAREHOUSE syndata_wh;
    
    GRANT OWNERSHIP ON DATABASE syndata_db TO ROLE data_engineer;
    GRANT USAGE ON WAREHOUSE syndata_wh TO ROLE data_engineer;
    GRANT ROLE data_engineer TO USER jsmith; -- Or whoever you want to run this example. Or skip this line to run it yourself.
    
    Copy
  2. Snowflake 샘플 데이터 데이터베이스에서 두 개의 뷰를 만듭니다.

    - Sign in as user with data_engineer role. Then...
    CREATE SCHEMA syndata_db.sch;
    CREATE OR REPLACE VIEW syndata_db.sch.TPC_ORDERS_5K as (
        SELECT * from SNOWFLAKE_SAMPLE_DATA.TPCH_SF1.ORDERS
        LIMIT 5000
    );
    CREATE OR REPLACE VIEW syndata_db.sch.TPC_CUSTOMERS_5K as (
        SELECT * from SNOWFLAKE_SAMPLE_DATA.TPCH_SF1.CUSTOMER
        LIMIT 5000
    );
    
    Copy
  3. 입력 테이블을 쿼리하여 데이터를 뷰하고 각 테이블에 5,000개의 행이 있는지 확인합니다.

    USE WAREHOUSE syndata_wh;
    SELECT TOP 20 * FROM syndata_db.sch.TPC_ORDERS_5K;
    SELECT COUNT(*) FROM syndata_db.sch.TPC_ORDERS_5K;
    select count(distinct o_clerk), count(*) from syndata_db.sch.TPC_ORDERS_5K;
    
    SELECT TOP 20 * FROM syndata_db.sch.TPC_CUSTOMERS_5K;
    SELECT COUNT(*) FROM syndata_db.sch.TPC_CUSTOMERS_5K;
    
    Copy
  4. GENERATE_SYNTHETIC_DATA 저장 프로시저를 호출하여 합성 데이터를 두 개의 출력 테이블로 생성합니다. 나중에 해당 키로 조인할 것이므로 조인 키를 지정하십시오.

    CALL SNOWFLAKE.DATA_PRIVACY.GENERATE_SYNTHETIC_DATA({
        'datasets':[
            {
              'input_table': 'syndata_db.sch.TPC_ORDERS_5K',
              'output_table': 'syndata_db.sch.TPC_ORDERS_5K_SYNTHETIC',
              'columns': {'O_CUSTKEY': {'join_key': True}}
            },
            {
              'input_table': 'syndata_db.sch.TPC_CUSTOMERS_5K',
              'output_table': 'syndata_db.sch.TPC_CUSTOMERS_5K_SYNTHETIC',
              'columns' : {'C_CUSTKEY': {'join_key': True}}
    
            }
          ],
          'replace_output_tables':True
      });
    
    Copy
  5. 출력 테이블을 쿼리하여 합성 데이터를 봅니다.

    SELECT TOP 20 * FROM syndata_db.sch.TPC_ORDERS_5K_SYNTHETIC;
    SELECT COUNT(*) FROM syndata_db.sch.TPC_ORDERS_5K_SYNTHETIC;
    
    SELECT TOP 20 * FROM syndata_db.sch.TPC_CUSTOMERS_5K_SYNTHETIC;
    SELECT COUNT(*) FROM syndata_db.sch.TPC_CUSTOMERS_5K_SYNTHETIC;
    
    Copy
  6. 모든 오브젝트 정리하기

    USE ROLE ACCOUNTADMIN;
    DROP DATABASE syndata_db;
    DROP ROLE data_engineer;
    DROP WAREHOUSE syndata_wh;
    
    Copy