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';
다음으로, ALTER ICEBERG TABLE … REFRESH 명령을 사용하여 테이블 메타데이터를 최신 메타데이터 파일과 동기화합니다. 다음 예제 명령은 메타데이터 파일 경로를 지정하여 테이블을 새로 고칩니다.
ALTER ICEBERG TABLE myIcebergTable REFRESH 'metadata/v2.metadata.json';
마지막으로, ALTER ICEBERG TABLE … CONVERT TO MANAGED 명령을 사용하여 Snowflake를 Iceberg 카탈로그로 사용하도록 테이블을 변환합니다.
ALTER ICEBERG TABLE myIcebergTable CONVERT TO MANAGED
BASE_LOCATION = myBaseLocation;
참고
이 예제에서는 테이블이 오브젝트 저장소의 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 데이터 타입을 테이블 데이터 파일에 기록합니다.
int
및 long
과 같은 데이터 타입의 경우 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 테이블 데이터 타입 섹션을 참조하십시오.