Snowflake의 스키마 감지 및 매핑

이 가이드에서는 Snowflake에서 BigQuery로 데이터를 전송할 때 스키마를 정의하는 방법을 보여줍니다. BigQuery Data Transfer Service를 사용하여 스키마 및 데이터 유형 매핑을 자동으로 감지하거나 변환 엔진을 사용하여 스키마 및 데이터 유형을 수동으로 정의할 수 있습니다.

자동 기본 스키마 감지 사용 설정

Snowflake 커넥터는 Snowflake 테이블 스키마를 자동으로 감지할 수 있습니다. 자동 스키마 감지를 사용하려면 Snowflake 전송을 설정할 때 변환 출력 GCS 경로 필드를 비워 두면 됩니다.

다음 목록은 Snowflake 커넥터가 Snowflake 데이터 유형을 BigQuery에 매핑하는 방법을 보여줍니다.

  • 다음 데이터 유형은 BigQuery에서 STRING로 매핑됩니다.
    • TIMESTAMP_TZ
    • TIMESTAMP_LTZ
    • OBJECT
    • VARIANT
    • ARRAY
  • 다음 데이터 유형은 BigQuery에서 TIMESTAMP로 매핑됩니다.
    • TIMESTAMP_NTZ

다른 모든 Snowflake 데이터 유형은 BigQuery의 해당 유형에 직접 매핑됩니다.

변환 엔진 출력을 사용하여 스키마 수동 정의

Snowflake용 BigQuery Data Transfer Service 커넥터는 Snowflake 테이블을 BigQuery로 마이그레이션할 때 스키마 매핑에 BigQuery 마이그레이션 서비스 변환 엔진을 사용합니다.

스키마를 수동으로 정의하려면 (예: 특정 스키마 속성을 재정의) 메타데이터를 생성한 후 변환 엔진을 실행하면 됩니다.

제한사항

  • 데이터는 BigQuery에 로드되기 전에 Parquet 데이터 형식으로 Snowflake에서 추출됩니다.

    • 다음 Parquet 데이터 유형은 지원되지 않습니다.
    • 다음 Parquet 데이터 유형은 지원되지 않지만 변환될 수는 있습니다.

      • TIMESTAMP_NTZ
      • OBJECT, VARIANT, ARRAY

      변환 엔진을 실행할 때 이러한 데이터 유형의 기본 동작을 재정의하려면 전역 유형 변환 구성 YAML을 사용합니다.

      구성 YAML은 다음 예시와 비슷할 수 있습니다.

      type: experimental_object_rewriter
      global:
        typeConvert:
          datetime: TIMESTAMP
          json: VARCHAR
      

필수 서비스 계정 권한

Snowflake 전송에서는 지정된 Cloud Storage 경로의 변환 엔진 출력에서 데이터를 읽는 데 서비스 계정이 사용됩니다. 서비스 계정에 storage.objects.getstorage.objects.list 권한을 부여해야 합니다.

서비스 계정은 전송 구성과 대상 데이터 세트가 생성된 동일한 Google Cloud 프로젝트에 속하는 것이 좋습니다. 서비스 계정이 BigQuery 데이터 전송을 만든 프로젝트와 다른 Google Cloud 프로젝트에 있으면 교차 프로젝트 서비스 계정 승인을 사용 설정해야 합니다.

자세한 내용은 BigQuery IAM 역할 및 권한을 참조하세요.

스키마 매핑 수동 정의

다음 단계에 따라 스키마 매핑을 수동으로 정의할 수 있습니다.

  1. Snowflake용 dwh-migration-tool을 실행합니다. 자세한 내용은 변환 및 평가를 위한 메타데이터 생성을 참조하세요.
  2. 생성된 metadata.zip 파일을 Cloud Storage 버킷에 업로드합니다. metadata.zip 파일은 변환 엔진의 입력으로 사용됩니다.
  3. target_types 필드를 metadata로 지정하여 일괄 변환 서비스를 실행합니다. 자세한 내용은 변환 API를 사용한 SQL 쿼리 변환을 참고하세요.

    • 다음은 Snowflake의 일괄 변환을 실행하는 명령어의 예시입니다.
      curl -d "{
      \"name\": \"sf_2_bq_translation\",
      \"displayName\": \"Snowflake to BigQuery Translation\",
      \"tasks\": {
          string: {
            \"type\": \"Snowflake2BigQuery_Translation\",
            \"translation_details\": {
                \"target_base_uri\": \"gs://sf_test_translation/output\",
                \"source_target_mapping\": {
                  \"source_spec\": {
                      \"base_uri\": \"gs://sf_test_translation/input\"
                  }
                },
                \"target_types\": \"metadata\",
            }
          }
      },
      }" \
      -H "Content-Type:application/json" \
      -H "Authorization: Bearer TOKEN" -X POST https://bigquerymigration.googleapis.com/v2alpha/projects/project_id/locations/location/workflows
    
    • BigQuery의 SQL 변환 페이지에서 이 명령어 상태를 확인할 수 있습니다. 일괄 변환 작업 출력은 gs://translation_target_base_uri/metadata/config/에 저장됩니다.

맞춤 스키마 파일

기본 키와 같이 마이그레이션 중에 손실될 수 있는 테이블에 대한 중요한 정보를 캡처해야 하는 경우 맞춤 스키마를 지정하는 것이 좋습니다. 예를 들어 증분 전송을 실행할 때는 BigQuery에 로드할 때 후속 전송의 데이터에 대한 파티션을 올바르게 나눌 수 있도록 커스텀 스키마 파일을 지정하는 것이 좋습니다. 스키마 파일이 없으면 BigQuery Data Transfer Service가 전송 중인 소스 데이터를 사용하여 테이블 스키마를 자동으로 적용하므로 기본 키 및 변경 추적에 대한 모든 정보가 손실될 수 있습니다.

데이터 전송 중에 열 이름이나 데이터 유형을 변경해야 하는 경우에도 맞춤 스키마가 유용할 수 있습니다.

커스텀 스키마 파일은 데이터베이스 객체를 설명하는 JSON 파일입니다. 스키마에는 데이터베이스 집합이 포함되며 각 데이터베이스에는 테이블 집합이, 각 테이블에는 열 집합이 포함됩니다. 각 객체에는 Snowflake의 객체 이름을 나타내는 originalName 필드와 BigQuery의 객체의 대상 이름을 나타내는 name 필드가 있습니다.

열에는 다음과 같은 필드가 있습니다.

  • originalType: Snowflake의 열 데이터 유형을 나타냅니다.
  • type: BigQuery의 열 대상 데이터 유형을 나타냅니다.
  • usageType: 시스템에서 열이 사용되는 방식에 관한 정보입니다. 지원되는 사용 유형은 다음과 같습니다.

    • DEFAULT: 이 사용 유형을 통해 한 대상 테이블의 여러 열에 주석을 추가할 수 있습니다. DEFAULT 사용 유형은 해당 열이 소스 시스템에서 특별한 용도가 없음을 나타냅니다. 기본값입니다.
    • PRIMARY_KEY: 이 사용 유형으로 각 대상 테이블의 열에 주석을 추가할 수 있습니다. PRIMARY_KEY 사용 유형을 사용하여 하나의 열만 기본 키로 식별하거나 복합 키의 경우 여러 열에 동일한 사용 유형을 사용하여 테이블의 고유 항목을 식별합니다. 이러한 열은 COMMIT_TIMESTAMP와 함께 작동하여 마지막 전송 실행 이후 생성 또는 업데이트된 행을 추출합니다.

다음 예시는 my_db 데이터베이스에서 orders라는 Snowflake 테이블을 전송하고, O_ORDERKEY 열의 이름을 ORDERKEY로 변경하고, O_ORDERSTATUS을 기본 키로 식별하는 맞춤 스키마 파일을 보여줍니다.

{
  "databases": [
    {
      "name": "my_db",
      "originalName": "my_db",
      "tables": [
        {
          "name": "orders",
          "originalName": "orders",
          "columns": [
            {
              "name": "ORDERKEY",
              "originalName": "O_ORDERKEY",
              "type": "INT64",
              "originalType": "NUMERIC",
              "usageType": [
                "PRIMARY_KEY"
              ],
              "isRequired": true,
              "originalColumnLength": 4
            },
            {
              "name": "O_ORDERSTATUS",
              "originalName": "O_ORDERSTATUS",
              "type": "STRING",
              "originalType": "VARCHAR",
              "usageType": [
                "DEFAULT"
              ],
              "isRequired": true,
              "originalColumnLength": 1
            }
          ]
        }
      ]
    }
  ]
}