Iceberg 테이블 변환하기

이 항목에서는 Snowflake에서 관리되지 않는 Iceberg 테이블 을 Snowflake를 Iceberg 카탈로그로 사용하는 테이블로 변환하는 방법에 대한 정보를 제공합니다.

Snowflake Iceberg 카탈로그 SDK 에 대한 지원을 포함하여 완전한 Snowflake 플랫폼 지원을 원하는 경우 테이블을 변환하도록 선택할 수 있습니다.

Iceberg 테이블을 변환하기 전에 Snowflake가 지원하는 다양한 Iceberg 카탈로그 옵션을 숙지하는 것이 좋습니다. 자세한 내용은 Iceberg 카탈로그 옵션 을 참조하십시오.

테이블 변환 전과 후

Iceberg 테이블을 변환하여 Snowflake를 카탈로그로 사용하면 테이블이 쓰기 가능한 상태가 되며 Snowflake가 테이블에 대한 수명 주기를 관리합니다.

다음 표는 변환 전후의 Iceberg 테이블을 비교한 내용입니다.

변환 전

변환 후

Iceberg 카탈로그

외부 카탈로그(예: AWS Glue) 또는 카탈로그가 전혀 없습니다. 카탈로그 통합이 필요합니다.

Snowflake. Snowflake는 원본 데이터의 변경 사항을 Snowflake 카탈로그에 등록합니다. 그런 다음 Snowflake는 외부 볼륨의 테이블 메타데이터를 업데이트합니다.

카탈로그 통합이 필요하지 않습니다.

Snowflake 읽기 작업

Snowflake 쓰기 작업

테이블 데이터 및 메타데이터의 저장소 위치

외부 볼륨(외부 클라우드 저장소).

지정한 기본 위치 아래의 외부 볼륨(외부 클라우드 저장소).

데이터 및 메타데이터 정리

수동으로 관리하거나 외부 카탈로그로 관리합니다.

Snowflake는 외부에서 생성된 데이터 및 메타데이터 파일은 손대지 않습니다.

Snowflake Iceberg Catalog SDK에서 액세스 가능

중요

Iceberg 테이블을 변환할 때 Snowflake는 외부 저장소를 잠그거나 외부 저장소에 단독으로 액세스할 수 있다고 가정하지 않습니다. 테이블 손상을 방지하려면 외부 저장소 위치에 대한 Snowflake 이외의 쓰기(예: 자동화된 유지 관리 작업)를 모니터링 및/또는 중지해야 합니다.

요구 사항

Iceberg 테이블을 변환하기 전에 Snowflake가 외부 볼륨에 쓸 수 있는지 확인하십시오.

Snowflake가 외부 볼륨에 쓰려면 다음 조건이 충족되어야 합니다.

  • ALTER ICEBERG TABLE … REFRESH 명령을 사용하여 테이블을 수동으로 새로 고친 후 테이블을 변환합니다.

  • 외부 볼륨의 ALLOW_WRITES 속성이 TRUE 로 설정됩니다. 기존 외부 볼륨에 대해 이 속성 값을 업데이트하려면 ALTER EXTERNAL VOLUME 명령을 사용하십시오. 예를 들어 ALTER EXTERNAL VOLUME my_ext_vol SET ALLOW_WRITES=TRUE 과 같습니다.

  • 클라우드 저장소 계정에 대해 설정한 액세스 제어 권한이 쓰기 액세스를 허용해야 합니다. 예를 들어 Amazon S3용으로 구성된 외부 볼륨을 사용하는 경우 IAM 역할에는 S3 위치에 대한 s3:PutObject 권한이 있어야 합니다.

예: Iceberg 테이블 변환하기

이 예제에서는 먼저 오브젝트 저장소의 Iceberg 파일에서 Iceberg 테이블을 생성합니다. Snowflake는 METADATA_FILE_PATH 값을 사용하여 열 정의에 대한 다음 위치(<ext-vol-storage-base-url>/path/to/metadata/v1.metadata.json)에서 테이블 메타데이터를 찾습니다.

CREATE ICEBERG TABLE myIcebergTable
  EXTERNAL_VOLUME='icebergMetadataVolume'
  CATALOG='icebergCatalogInt'
  METADATA_FILE_PATH='path/to/metadata/v1.metadata.json';
Copy

다음으로, ALTER ICEBERG TABLE … REFRESH 명령을 사용하여 테이블 메타데이터를 최신 메타데이터 파일과 동기화합니다. 다음 예제 명령은 메타데이터 파일 경로를 지정하여 테이블을 새로 고칩니다.

ALTER ICEBERG TABLE myIcebergTable REFRESH 'metadata/v2.metadata.json';
Copy

마지막으로, ALTER ICEBERG TABLE … CONVERT TO MANAGED 명령을 사용하여 Snowflake를 Iceberg 카탈로그로 사용하도록 테이블을 변환합니다.

ALTER ICEBERG TABLE myIcebergTable CONVERT TO MANAGED
  BASE_LOCATION = myBaseLocation;
Copy

참고

이 예제에서는 테이블이 오브젝트 저장소의 Iceberg 파일에서 생성되었고 BASE_LOCATION 이 원래 CREATE ICEBERG TABLE 문에 포함되지 않았으므로 ALTER 문에서 BASE_LOCATION 을 지정해야 합니다. BASE_LOCATION 은 외부 볼륨에서 Snowflake가 변환된 테이블에 대한 테이블 데이터와 메타데이터를 쓰는 디렉터리까지의 상대 경로를 정의합니다.

그렇지 않고 원래 CREATE ICEBERG TABLE 문에 BASE_LOCATION 이 지정된 경우 이를 ALTER ICEBERG TABLE … CONVERT TO MANAGED 명령에 포함할 필요가 없습니다.

예를 들어 Snowflake는 테이블 데이터를 <ext-vol-storage-base-url>/myBaseLocation/data/ 에 씁니다.

Snowflake는 변환된 테이블의 메타데이터를 <ext-vol-storage-base-url>/myBaseLocation/metadata/ 에 기록합니다.

변환 및 데이터 타입

Snowflake가 지원하지 않는 Iceberg 데이터 타입이 있는 테이블을 변환하는 경우 Snowflake는 Snowflake 데이터 타입 을 사용하여 값을 처리하고 반환합니다. 그러나 Snowflake는 Apache Spark 등의 다른 컴퓨팅 엔진에서 테이블을 사용할 수 있도록 원래 Iceberg 데이터 타입을 테이블 데이터 파일에 기록합니다.

intlong 과 같은 데이터 타입의 경우 Snowflake가 처리에 사용하는 데이터 타입은 원본 데이터 타입보다 더 큰 범위의 값을 지원합니다. Snowflake는 원본 데이터 타입과의 일관성을 유지하기 위해 원본 데이터 타입이 지원하는 범위를 벗어나는 값의 삽입을 허용하지 않습니다.

예를 들어 Iceberg 유형 int 의 열이 있는 테이블을 생각해 보겠습니다. 변환 후 Snowflake는 Snowflake 데이터 타입 NUMBER(10,0)을 사용하여 열 값을 처리합니다. NUMBER(10,0)의 범위는 (-9,999,999,999, +9,999,999,999)이지만 int 의 범위는 (-2,147,483,648, +2,147,483,647)로 더욱 제한됩니다. 그 열에 3,000,000,000이라는 값을 삽입하려고 하면 Snowflake에서 범위 이탈을 알리는 오류 메시지를 반환합니다.

제한 사항을 포함하여 데이터 타입에 대한 자세한 내용은 Iceberg 테이블 데이터 타입 섹션을 참조하십시오.