Apache Iceberg™ 테이블: Apache Iceberg™ v3에 대한 지원(미리 보기)¶
이 미리 보기에서는 Apache Iceberg™ 사양의 v3에 대한 지원을 소개하지만, 몇 가지 고려 사항과 제한 사항이 있습니다. 달리 명시되지 않는 한, 이 미리 보기에서는 Snowflake 관리형 Iceberg 테이블과 외부 관리형 Iceberg 테이블이 모두 지원됩니다.
지원되는 Iceberg v3 기능¶
이 섹션에는 이 미리 보기에서 지원되는 Iceberg v3 기능이 나열되어 있습니다.
데이터 타입¶
공개 미리 보기에서 지원되는 v3 데이터 타입은 다음과 같습니다.
geographygeometrynanosecondvariant
자세한 내용은 Iceberg v3 데이터 타입 섹션을 참조하십시오.
기본값¶
:ref:`기본값 <label-tables_iceberg_default_values>`을 참조하세요.
삭제 벡터¶
:ref:`삭제 벡터 <tables-iceberg-deletion-vectors>`를 참조하세요.
행 계보¶
:ref:`행 계보 <label-tables_iceberg_row_lineage>`를 참조하세요.
기본 Iceberg 버전 구성¶
Iceberg 테이블에는 본질적으로 준수하는 형식 버전이 있습니다. 표준 Snowflake 데이터베이스의 외부 관리형 Iceberg 테이블의 경우 Snowflake는 테이블의 메타데이터에서 이 버전을 검색합니다.
다음 Iceberg 테이블의 경우 테이블 소유자는 테이블이 준수해야 하는 Iceberg 버전을 지정해야 합니다.
Snowflake 관리형 Iceberg 테이블
:doc:`카탈로그 연결 데이터베이스 </user-guide/tables-iceberg-catalog-linked-database>`에서 생성하는 외부 관리형 Iceberg 테이블
Snowflake의 시스템 기본 Iceberg 형식 버전은 v2이지만 필요한 경우 v3으로 설정할 수 있습니다. Iceberg 버전을 v3으로 설정하려면 다음 작업 중 하나를 수행합니다.
ICEBERG_VERSION_DEFAULT 매개 변수를 사용하여 계정, 데이터베이스, 스키마 수준에서 Iceberg 버전을
3`으로 설정합니다. 자세한 내용은 :ref:`label-iceberg_version_default섹션을 참조하십시오.CREATE ICEBERG TABLE 문에 :code:`ICEBERG_VERSION = 3`을 지정합니다.
참고
Iceberg 테이블을 생성할 때 Iceberg 버전을 지정하지 않으면 테이블은 기본적으로 스키마, 데이터베이스 또는 계정에 대해 설정된 Iceberg 버전으로 설정됩니다. 스키마는 데이터베이스보다 우선하고, 데이터베이스는 계정보다 우선합니다.
조심
다른 엔진을 사용하여 테이블 속성의 Iceberg 테이블 형식-버전을 v3으로 업그레이드하기 전에 아직 v3을 지원하지 않는 엔진이나 애플리케이션에서 테이블을 사용하지 않는지 확인합니다. Apache Iceberg 사양에서는 형식 버전 다운그레이드가 지원되지 않습니다. 따라서 모든 판독기와 작성기는 v3을 지원해야 합니다. Snowflake에서 Iceberg 테이블의 기본 버전은 v2이며, 필요한 경우 v3으로 구성할 수 있습니다. Snowflake를 사용하여 현재 위치에서 버전 업그레이드를 수행하는 기능은 현재 지원되지 않습니다.
사용법 노트¶
계정 수준에서 ICEBERG_VERSION_DEFAULT 매개 변수를 수정하려면 ACCOUNTADMIN 역할이 있는 계정 관리자여야 합니다.
데이터베이스 또는 스키마 수준에서 ICEBERG_VERSION_DEFAULT 매개 변수를 수정하려면 작업을 수행하는 데 사용되는 역할에 각 데이터베이스 또는 스키마에 대한 OWNERSHIP 권한이 있어야 합니다.
예¶
v3을 사용하여 my_db 데이터베이스의 새 Iceberg 테이블을 생성하도록 지정합니다.
ALTER DATABASE my_db SET ICEBERG_VERSION_DEFAULT=3;
v3을 사용하여 새로운 외부 관리형 Iceberg 테이블을 생성합니다. 명령에 포함된 열 정의는 원격 카탈로그에서 새 테이블이 생성되거나 기존 테이블이 대체됨을 나타냅니다. 이는 기존 버전이 없는 새 테이블이므로 테이블이 성공적으로 생성됩니다.
CREATE OR REPLACE ICEBERG TABLE my_iceberg_v3_table (
boolean_col boolean,
int_col int,
long_col long,
)
CATALOG='my_catalog_integration'
ICEBERG_VERSION=3;
Iceberg 메타데이터가 있는 기존 테이블에서 v3을 사용하여 외부 관리형 Iceberg 테이블을 생성합니다. 이 예제에서 열 정의 또는 형식 버전이 없다는 것은 이 테이블이 이미 존재하고 열 사양 및 형식 버전이 원격 카탈로그의 Iceberg 메타데이터에서 유추된다는 것을 나타냅니다. 이 예제에서는 :doc:`카탈로그 발급 자격 증명 </user-guide/tables-iceberg-configure-catalog-integration-vended-credentials>`을 사용하므로 CREATE ICEBERG TABLE 문에서 EXTERNAL_VOLUME 매개 변수가 제외됩니다.
CREATE OR REPLACE ICEBERG TABLE my_iceberg_v3_table
CATALOG = 'my_catalog_integration'
CATALOG_TABLE_NAME = 'my_table'
AUTO_REFRESH = TRUE;
참고
ALTER ICEBERG TABLE 명령을 사용하여 기존 테이블의 형식 버전을 변경할 수 없습니다.
Iceberg 테이블의 형식 버전 가져오기¶
다음 예제에서는 특정 테이블에 대한 Iceberg 버전을 가져오는 방법을 보여줍니다.
SHOW PARAMETERS LIKE 'ICEBERG_VERSION' IN TABLE my_v3_iceberg_table;
출력:
+-----------------+-------+---------+-------+---------------------------------------------------+--------+ | key | value | default | level | description | type | +-----------------+-------+---------+-------+---------------------------------------------------+--------+ | ICEBERG_VERSION | 3 | 2 | TABLE | Specifies the Iceberg table format version to ... | NUMBER | +-----------------+-------+---------+-------+---------------------------------------------------+--------+
다음 예제에서는 GET_DDL 함수를 통해 Iceberg 테이블 정의를 검색하여 특정 테이블의 Iceberg 버전을 가져오는 방법을 보여줍니다.
SELECT GET_DDL('ICEBERG_TABLE', 'my_v3_iceberg_table');
출력:
CREATE ICEBERG TABLE my_v3_iceberg_table ( record VARIANT, event_timestamp TIMESTAMP_LTZ(6) ) CATALOG = 'SNOWFLAKE' EXTERNAL_VOLUME = 'my_external_volume' BASE_LOCATION = 'my_iceberg_table' ICEBERG_VERSION = 3;
Iceberg v3 기능에 대한 고려 사항 및 제한 사항¶
Iceberg v3 기능을 사용할 때 다음 정보를 고려합니다.
지원되지 않는 Snowflake 기능¶
다음 Snowflake 기능은 이 Iceberg v3용 미리 보기에서 지원되지 않습니다.
외부 관리형 Iceberg 테이블의 Append-only 스트림
SnowGov 리전
외부 카탈로그를 사용하는 테이블의 경우 OBJECT, ARRAY, MAP을 포함하는 정형화 타입 열이 있는 Iceberg v3 테이블을 생성할 수 없습니다. 예를 들어, CREATE ICEBERG TABLE … AS SELECT(CTAS)를 사용하여 정형화 타입 열이 있는 외부 관리형 Iceberg v3 테이블을 생성할 수 없습니다.
정형화 타입 열이 있는 Snowflake 관리형 Iceberg v3 테이블은 생성할 수 있습니다.
v2 테이블을 복제한 다음 복제본을 v3으로 업그레이드하는 작업을 포함하여 Snowflake 관리형 Iceberg 테이블을 v2에서 v3으로 제자리 업그레이드
중요
Apache Spark를 사용하여 외부 관리형 Iceberg 테이블을 v2에서 v3으로 업그레이드하는 경우 DML 작업과 같이 새 스냅샷을 생성하는 커밋을 사용해야 합니다. 그렇지 않은 경우 새 스냅샷 없이 테이블 속성에서 형식 버전이 업데이트되면 새 스냅샷이 생성될 때까지 테이블에 대한 Snowflake의 수동 및 자동 새로 고침이 실패합니다.
다음 예제에서는 Apache Spark를 사용하여 외부 관리형 Iceberg 테이블을 v2에서 v3으로 업그레이드합니다.
ALTER TABLE table_name SET TBLPROPERTIES('format-version'='3');
참고
지원되지 않는 기능의 목록은 아직 확정되지 않았으며 향후 변경될 수 있습니다. 목록은 지원되지 않는 최신 기능을 반영하여 필요에 따라 업데이트됩니다.
v3 기능과 관련된 고려 사항 및 제한 사항은 기능에 대한 :ref:`기능 항목 <label-apache_iceberg_specification_supported_v3_features>`을 참조하세요.
지원되는 Snowflake 기능¶
지원되지 않는 Snowflake 기능 섹션에 나열되지 않는 기능이 지원됩니다. 지원되는 기능에는 다음 목록의 기능이 포함됩니다.
특징 |
참고 |
|---|---|
클러스터링 |
Snowflake 관리형 Iceberg v3 전용입니다. |
다음 고려 사항과 함께 지원됩니다.
|
|
LOAD_MODE = FULL_INGEST 또는 ADD_FILES COPY는 다음을 고려하여 지원됩니다.
|
|
다음 제한 사항이 있지만 지원됩니다.
|
|
데이터 보호 정책 |
다음 데이터 보호 정책이 지원됩니다.
|
데이터 품질 모니터링 |
|
v3 외부 관리형 Iceberg 테이블을 동적 테이블의 대상으로 작성합니다. |
|
쿼리 가속 |
|
민감한 데이터 분류 |
|
또한 분할된 테이블은 삭제 벡터를 작성할 수 없으며, 분할된 테이블에는 copy-on-write만 지원됩니다. |
|
버전 4.0 이상입니다. |
|
1.33.0 이상입니다. |
|
Snowpark pandas API 메서드 to_iceberg |
ICEBERG_VERSION_DEFAULT가 계정, 데이터베이스 또는 스키마에 설정된 경우 Iceberg v3에 대해서만 지원됩니다. 테이블 수준에서 ICEBERG_VERSION = 3이 설정된 경우 Snowpark pandas API 메서드 to_iceberg는 지원되지 않습니다. |
추가 또는 덮어쓰기 메서드를 사용하여 기존 Iceberg v3 테이블에 데이터 프레임을 작성하는 기능이 지원됩니다. 새 Iceberg v3 테이블 생성은 지원되지 않습니다. |
|
|
|
지원되지 않는 Iceberg v3 기능¶
Iceberg v3 사양의 다음 기능은 지원되지 않습니다.
중첩된 베리언트
분할 및 정렬을 위한 다중 인자 변환
테이블 암호화 키
UNKNOWN 데이터 타입
예제: 기존 Snowflake 기능과 함께 v3 지원¶
이 섹션에서는 v3에서 지원되는 기존 Snowflake 기능의 예를 나열합니다. 기능 목록에는 지원되는 경우 Snowflake 관리형 테이블과 외부 관리형 테이블의 예가 포함됩니다.
이 Iceberg v3용 미리 보기에서 지원되는 Snowflake 기능의 전체 목록은 :ref:`지원되는 Snowflake 기능 <label-iceberg_v3_supported_snowflake_features>`을 참조하세요.
v3 Iceberg 테이블 생성¶
다음 예제에서는 Apache Iceberg™ 사양의 v3을 준수하는 Snowflake 관리형 Apache Iceberg™ 테이블을 생성합니다.
CREATE ICEBERG TABLE my_v3_iceberg_table (
record VARIANT,
event_timestamp TIMESTAMP_LTZ(6)
)
CATALOG = 'SNOWFLAKE'
EXTERNAL_VOLUME = 'my_external_volume'
BASE_LOCATION = 'my_iceberg_table'
ICEBERG_VERSION = 3;
다음 예제에서는 원격 Iceberg REST 카탈로그를 사용하고 Apache Iceberg™ 사양의 v3을 준수하는 Apache Iceberg™ 테이블을 생성합니다.
참고
형식 버전이 외부 카탈로그의 메타데이터에 이미 정의되어 있어 Snowflake가 메타데이터에서 이 버전을 검색하므로 명령에 :code:`ICEBERG_VERSION = 3`을 지정할 필요가 없습니다.
CREATE ICEBERG TABLE my_v3_iceberg_table
EXTERNAL_VOLUME = 'my_external_volume'
CATALOG = 'my_rest_catalog_integration'
CATALOG_TABLE_NAME = 'my_remote_table'
AUTO_REFRESH = TRUE;
다음 예제에서는 열 정의가 포함된 :doc:`카탈로그 연결 데이터베이스 </user-guide/tables-iceberg-catalog-linked-database>`에서 쓰기 가능한 Iceberg 테이블을 생성하고 Apache Iceberg™ 사양의 v3을 준수합니다.
USE DATABASE my_catalog_linked_db;
USE SCHEMA 'my_namespace';
CREATE OR REPLACE ICEBERG TABLE my_iceberg_table (
first_name string,
last_name string,
amount int,
create_date date
)
ICEBERG_VERSION = 3;
v3 Iceberg 테이블에 작성¶
DML 명령 INSERT, UPDATE, DELETE, MERGE, TRUNCATE TABLE 및 COPY INTO는 Snowflake 관리형 및 외부 관리형 Iceberg v3 테이블 작성할 수 있도록 지원됩니다.
다음 예제에서는 Apache Iceberg™ 테이블 사양의 v3을 준수하는 Apache Iceberg™ 테이블에 행을 삽입합니다.
INSERT INTO my_v3_iceberg_table (id, payload) VALUES (1, PARSE_JSON('{"name": "Alice", "age": 30}'));
다음 예제에서는 Apache Iceberg™ 테이블 사양의 v3을 준수하는 Apache Iceberg™ 테이블에 파일을 로드합니다.
COPY INTO my_v3_iceberg_table
FROM @my_json_stage
FILE_FORMAT = 'my_json_format'
MATCH_BY_COLUMN_NAME = CASE_SENSITIVE;
Snowpipe를 사용하여 데이터 로드¶
다음 예제에서는 Snowflake 관리형 테이블과 외부 관리형 테이블 모두에 대해 Iceberg v3 테이블의 파일에서 데이터를 로드합니다.
CREATE PIPE mypipe
AUTO_INGEST = TRUE
INTEGRATION = 'MYINT'
AS
COPY INTO snowpipe_db.public.my_v3_iceberg_table
FROM @snowpipe_db.public.mystage
FILE_FORMAT = (TYPE = 'JSON');
참고
Snowflake는 Iceberg v3에 대한 추가 작성 기능을 지원합니다. 이 목록은 :ref:`Iceberg v3 기능에 대한 고려 사항 및 제한 사항 <iceberg-v3_considerations_limitations>`을 참조한 후 지원되는 Snowflake 기능 목록을 참조하세요.
v3 동적 Iceberg 테이블 생성¶
다음 예제에서는 v3 Snowflake 관리형 Iceberg 테이블을 동적 테이블의 출력으로 작성합니다.
CREATE DYNAMIC ICEBERG TABLE my_dynamic_iceberg_v3_table (
num_orders NUMBER(10,0),
order_day
)
TARGET_LAG = '20 minutes'
WAREHOUSE = my_warehouse
EXTERNAL_VOLUME = 'my_external_volume'
CATALOG = 'SNOWFLAKE'
BASE_LOCATION = 'my_dynamic_iceberg_v3_table'
ICEBERG_VERSION = 3
AS
SELECT
COUNT(DISTINCT order_id)
DATE_TRUNC('DAY', order_timestamp_ns) AS order_day
FROM staging_v3_iceberg_table;
참고
v2 또는 v3 외부 관리형 Iceberg 테이블을 동적 테이블의 대상으로 작성하는 기능은 지원되지 않습니다. 동적 Iceberg 테이블의 출력은 Snowflake 관리형만 가능합니다.
v3 Iceberg 테이블 쿼리¶
다음 예제에서는 Snowflake 관리형 또는 외부 관리형 Iceberg v3 테이블을 쿼리합니다.
SELECT * FROM MY_DB.MY_SCHEMA.MY_ICEBERG_V3_TABLE;