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

이번 릴리스에서는 합성 데이터를 생성하는 새로운 저장 프로시저(GENERATE_SYNTHETIC_DATA)가 도입되었습니다.

개요

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

이점

통계적 일관성:

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

제품 검증:

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

합성 데이터 알고리즘 정보

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

합성 데이터 생성하기

1개 이상의 테이블에서 합성 데이터를 생성하려면 GENERATE_SYNTHETIC_DATA 로 문의하십시오. Snowflake는 저장 프로시저를 호출하는 역할에 소유권이 부여된 합성 데이터 테이블을 생성합니다. 출력 테이블은 입력 테이블과 동일한 열 수와 동일한 열 이름 및 데이터 타입을 갖습니다. 개인정보 보호 필터 를 활성화하지 않는 한 출력 테이블의 행 수는 일반적으로 동일합니다(이 경우 출력 테이블의 행 수가 더 적을 수 있음).

생성된 데이터 값

Snowflake는 소스 데이터 타입에 따라 조인 키가 아닌 열에 대한 합성 데이터를 생성합니다.

  • 통계 데이터: 숫자, 부울, 날짜, 시간 또는 타임스탬프 타입의 데이터입니다. 생성된 데이터는 소스 데이터와 유사한 값으로 동일한 유형입니다.

  • 범주형 문자열 몇 개의 고유값이 있는 문자열 열. 생성된 데이터는 소스 데이터의 실제 값을 사용합니다.

  • 비범주 문자열 많은 고유 값이 있는 문자열 열. GENERATE_SYNTHETIC_DATA 에서 replace 옵션으로 출력 형식을 지정하지 않으면 출력에서 삭제됩니다.

GENERATE_SYNTHETIC_DATA 에 categorical 값을 제공하여 조인 키가 아닌 문자열 열을 범주형 또는 비범주형으로 명시적으로 지정할 수 있습니다. 조인 키 열은 범주가 아닌 문자열이거나 통계여야 합니다.

각 테이블에 생성된 데이터는 원래 테이블에 있는 대략적인 분포와 상관관계를 유지합니다.

조인 키로 지정된 열은 모든 데이터 타입을 사용할 수 있으며, 동일한 타입과 일관된 값을 가진 합성 데이터가 생성됩니다.

고유 값이 거의 없음 은 고유 값의 수가 행 수의 절반 미만임을 의미합니다. 고유 값이 많음 은 고유 값의 수가 행 수의 절반 이상임을 의미합니다.

통합 데이터에서 조인 키 일관성 유지

종합 데이터에 대해 조인 쿼리를 실행할 계획이라면 조인할 모든 열을 조인 키 로 지정하십시오. GENERATE_SYNTHETIC_DATA 에 join_key 값을 지정하여 숫자, 부울 또는 범주가 아닌 열을 조인 키로 지정할 수 있습니다. 단일 실행 중에 모든 테이블의 모든 조인 키에 대해 소스 데이터의 동일한 값에 대해 출력 데이터에 일관된 합성 값이 생성됩니다. 이를 통해 조인 쿼리를 실행하고 소스 데이터에 대해 동일한 쿼리를 실행할 때와 유사한 결과를 얻을 수 있습니다.

테이블 간의 조인 일관성을 유지하려면 각 테이블의 동일한 조인 키 열에 동일한 인자가 있는지 확인합니다. 즉, 테이블 간에 cust_id 조인이 가능해야 하는 경우 각 데이터 세트 오브젝트의 columns 설명에 동일한 인자 및 값 세트를 제공해야 합니다.

'datasets':[
  {
    'input_table': 'd.s.orders',
    'output_table': 'd.s.orders_synth',
    'columns': {'cust_id': {'join_key': True, 'replace': 'uuid'}, ...}
  },
  {
    'input_table': 'd.s.customers',
    'output_table': 'd.s.customers_synth',
    'columns' : {'cust_id': {'join_key': True, 'replace':'uuid'}, ...}

  }
]
Copy

GENERATE_SYNTHETIC_DATA 에서 대칭 문자열 시크릿consistency_secret 에 제공하면 조인 키 값이 테이블 및 여러 실행에서 일관되게 유지됩니다. 시크릿을 지정하지 않으면 조인 키 값은 단일 실행의 모든 테이블에서 일관되지만 여러 실행에서는 일관되지 않습니다. 다중 실행 일관성은 문자열 열에 대해서만 지원됩니다.

예제: 단일 실행 조인 키 일관성

CALL SNOWFLAKE.DATA_PRIVACY.GENERATE_SYNTHETIC_DATA({
  'datasets':[
      {
        'input_table': 'CLINICAL_DB.PUBLIC.PATIENTS1',
        'output_table': 'MY_DB.PUBLIC.PATIENTS1',
        'columns': { 'patient_id': {'join_key': TRUE}, 'age':{'join_key': TRUE}}
      },
      {
        'input_table': 'CLINICAL_DB.PUBLIC.PATIENTS2',
        'output_table': 'MY_DB.PUBLIC.PATIENTS2',
        'columns': { 'patient_id': {'join_key': TRUE}, 'age':{'join_key': TRUE}}
      }
    ],
    'replace_output_tables': TRUE
});
Copy

예제: 다중 실행 조인 키 일관성

-- Generate consistent join keys across multiple runs by
-- providing a symmetric key secret.
CREATE OR REPLACE SECRET my_db.public.my_consistency_secret
  TYPE=SYMMETRIC_KEY
  ALGORITHM=GENERIC;

CALL SNOWFLAKE.DATA_PRIVACY.GENERATE_SYNTHETIC_DATA({
  'datasets':[
      {
        'input_table': 'CLINICAL_DB.PUBLIC.BASE_TABLE',
        'output_table': 'MY_DB.PUBLIC.PATIENTS1',
        'columns': { 'patient_id': {'join_key': TRUE}}
      }
    ],
    'consistency_secret': SYSTEM$REFERENCE('SECRET', 'MY_CONSISTENCY_SECRET', 'SESSION', 'READ')::STRING,
    'replace_output_tables': TRUE
});

CALL SNOWFLAKE.DATA_PRIVACY.GENERATE_SYNTHETIC_DATA({
  'datasets':[
      {
        'input_table': 'CLINICAL_DB.PUBLIC.SECOND_TABLE',
        'output_table': 'MY_DB.PUBLIC.PATIENTS2',
        'columns': { 'patient_id': {'join_key': TRUE}}
      }
    ],
    'consistency_secret': SYSTEM$REFERENCE('SECRET', 'MY_CONSISTENCY_SECRET', 'SESSION', 'READ')::STRING,
    'replace_output_tables': TRUE
});
Copy

개인 정보 보호 개선

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

NULL 값이 문자열이 아닌 열에 있으면 유사성 필터가 실패하고 합성 데이터가 생성되지 않습니다.

요구 사항

입력 테이블 요구 사항

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

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

  • 최소 20개의 고유 행

  • 최대 100개 열

  • 최대 14M 행

  • 다음 입력 테이블 유형이 지원됩니다.

    • 일반, 임시, 동적 및 일시적 테이블

    • 규칙적이고, 구체화되고, 안전하고, 보안이 보강된 구체화된 뷰

  • 다음 입력 테이블 유형은 지원되지 않습니다.

    • 외부, Apache Iceberg™ 및 하이브리드 테이블

    • 스트림

  • 지원되는 열 유형은 다음과 같습니다. 지원되지 않는 데이터 타입의 열은 열의 모든 값에 대해 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