Apache Iceberg™ 테이블: Apache Iceberg™ v3에 대한 지원(미리 보기)

이 미리 보기에서는 Apache Iceberg™ 사양의 v3에 대한 지원을 소개하지만, 몇 가지 고려 사항과 제한 사항이 있습니다. 달리 명시되지 않는 한, 이 미리 보기에서는 Snowflake 관리형 Iceberg 테이블과 외부 관리형 Iceberg 테이블이 모두 지원됩니다.

지원되는 Iceberg v3 기능

이 섹션에는 이 미리 보기에서 지원되는 Iceberg v3 기능이 나열되어 있습니다.

데이터 타입

공개 미리 보기에서 지원되는 v3 데이터 타입은 다음과 같습니다.

  • geography

  • geometry

  • nanosecond

  • variant

자세한 내용은 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;
Copy

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;
Copy

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;
Copy

참고

ALTER ICEBERG TABLE 명령을 사용하여 기존 테이블의 형식 버전을 변경할 수 없습니다.

Iceberg 테이블의 형식 버전 가져오기

  • 다음 예제에서는 특정 테이블에 대한 Iceberg 버전을 가져오는 방법을 보여줍니다.

    SHOW PARAMETERS LIKE 'ICEBERG_VERSION' IN TABLE my_v3_iceberg_table;
    
    Copy

    출력:

    +-----------------+-------+---------+-------+---------------------------------------------------+--------+
    | 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');
    
    Copy

    출력:

     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 스트림

  • Snowflake의 dbt 프로젝트

  • 스키마 추론

  • Snowpipe Streaming classic architecture

  • 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');
    
    Copy

참고

  • 지원되지 않는 기능의 목록은 아직 확정되지 않았으며 향후 변경될 수 있습니다. 목록은 지원되지 않는 최신 기능을 반영하여 필요에 따라 업데이트됩니다.

  • v3 기능과 관련된 고려 사항 및 제한 사항은 기능에 대한 :ref:`기능 항목 <label-apache_iceberg_specification_supported_v3_features>`을 참조하세요.

지원되는 Snowflake 기능

지원되지 않는 Snowflake 기능 섹션에 나열되지 않는 기능이 지원됩니다. 지원되는 기능에는 다음 목록의 기능이 포함됩니다.

특징

참고

목록 자동 복제

자동 새로 고침

카탈로그 통합

카탈로그 연결 데이터베이스

복제

클러스터링

Snowflake 관리형 Iceberg v3 전용입니다.

외부 관리형 v3 테이블을 Snowflake 관리형 테이블로 변환하기

다음 고려 사항과 함께 지원됩니다.

  • v3 Iceberg 테이블을 변환할 때 Iceberg 분할은 그대로 유지됩니다.

  • 변환 전에 Snowflake는 외부 저장소에서 메타데이터, 매니페스트 목록 또는 매니페스트를 삭제하지 않습니다.

  • 변환 중에 Snowflake는 메타데이터 또는 Parquet 데이터 파일을 다시 작성하지 않습니다.

  • 변환 후 Snowflake는 테이블의 수명 주기 관리를 전적으로 담당하는 카탈로그입니다. Snowflake는 변환 전후에 생성된 메타데이터, 매니페스트 목록, 매니페스트 및 데이터 파일이 만료되고 보존 기간이 지나면 외부 저장소에서 삭제합니다.

COPY INTO <테이블>

LOAD_MODE = FULL_INGEST 또는 ADD_FILES COPY는 다음을 고려하여 지원됩니다.

  • Parquet 파일에 행 계보 메타데이터 열(_row_id_last_updated_sequence_number)을 로드하려면 FULL_INGEST 옵션을 사용해야 합니다. 기타 LOAD_MODE 메서드는 지원되지 않습니다. 그러나 행 계보가 포함된 Parquet 파일은 이미 Iceberg v3 테이블의 일부일 수 있습니다. ADD_FILES_COPY를 사용하여 Parquet 파일을 등록하는 작업은 해당 파일이 이미 다른 Iceberg 테이블의 일부인 경우 권장되지 않습니다. 파일을 다시 작성하지 않고 외부 관리형 Iceberg 테이블을 Snowflake 관리형 Iceberg 테이블로 변환하는 가장 좋은 방법은 ALTER ICEBERG TABLE … CONVERT TO MANAGED 명령을 사용하는 것입니다.

COPY INTO <위치>

다음 제한 사항이 있지만 지원됩니다.

  • VARIANT, GEOMETRY 및 GEOGRAPHY는 JSON으로 인코딩된 문자열로 언로드됩니다.

  • TIMESTAMP_NTZ(9)는 나노초가 아닌 밀리초로 언로드됩니다.

  • TIMESTAMP_LTZ(9), ARRAY, OBJECT 및 MAP은 다른 데이터 타입으로 캐스팅해야 합니다.

Data Clean Rooms

데이터 계보

데이터 보호 정책

다음 데이터 보호 정책이 지원됩니다.

  • 마스킹 정책

  • 행 액세스 정책

  • 프로젝션 정책

  • 집계 정책

  • 개인정보 보호정책

  • 조인 정책

Apache Spark의 데이터 보호 정책 적용

데이터 품질 모니터링

Dynamic tables

v3 외부 관리형 Iceberg 테이블을 동적 테이블의 대상으로 작성합니다.

Horizon Iceberg REST 카탈로그 API

LOB(Large Object)

구체화된 뷰

오브젝트 태깅

쿼리 가속

Replication

검색 최적화

보안 뷰

민감한 데이터 분류

대상 파일 크기

단일 인자 Iceberg 분할

또한 분할된 테이블은 삭제 벡터를 작성할 수 없으며, 분할된 테이블에는 copy-on-write만 지원됩니다.

Kafka용 Snowflake 커넥터

버전 4.0 이상입니다.

Snowpark

1.33.0 이상입니다.

Snowpark pandas API 메서드 to_iceberg

ICEBERG_VERSION_DEFAULT가 계정, 데이터베이스 또는 스키마에 설정된 경우 Iceberg v3에 대해서만 지원됩니다. 테이블 수준에서 ICEBERG_VERSION = 3이 설정된 경우 Snowpark pandas API 메서드 to_iceberg는 지원되지 않습니다.

Apache Spark용 Snowpark Connect

추가 또는 덮어쓰기 메서드를 사용하여 기존 Iceberg v3 테이블에 데이터 프레임을 작성하는 기능이 지원됩니다. 새 Iceberg v3 테이블 생성은 지원되지 않습니다.

Snowpipe

Snowpipe Streaming high-performance architecture

공유

스트림

  • Append-only 스트림과 표준 스트림은 Snowflake 관리형 Iceberg v3 테이블에서 지원됩니다.

  • Insert-only 스트림과 표준 스트림은 외부 관리형 Iceberg v3 테이블에서 지원됩니다.

    • 표준 스트림이 올바른 결과를 생성하도록 하려면 외부 엔진이 Iceberg v3 사양과 관련하여 Iceberg v3 테이블에 작성해야 합니다. 특히, 새로 삽입된 행에는 :code:`_row_id=NULL`이 있어야 합니다. copy-on-write 중에 복사된 행은 :code:`_row_id`를 유지해야 합니다.

    • MAX_DATA_EXTENSION_TIME_IN_DAYS는 외부 관리형 Iceberg v3 테이블에서는 작동하지 않습니다.

  • DMLs가 다중 문 트랜잭션을 통해 커밋되는 경우, Iceberg v3 테이블의 append-only 스트림은 Iceberg v2 테이블과 의미 체계가 다릅니다.

    • Iceberg v2에서 append-only 스트림의 경우 다중 문 트랜잭션에서 행이 추가된 후 삭제되면 이 행은 삽입으로 간주됩니다.

    • Iceberg v3에서 append-only 스트림의 경우 이 행은 삽입으로 처리되지 않습니다.

테이블 최적화

지원되지 않는 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;
Copy

다음 예제에서는 원격 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;
Copy

다음 예제에서는 열 정의가 포함된 :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;
Copy

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}'));
Copy

다음 예제에서는 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;
Copy

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');
Copy

참고

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;
Copy

참고

v2 또는 v3 외부 관리형 Iceberg 테이블을 동적 테이블의 대상으로 작성하는 기능은 지원되지 않습니다. 동적 Iceberg 테이블의 출력은 Snowflake 관리형만 가능합니다.

v3 Iceberg 테이블 쿼리

다음 예제에서는 Snowflake 관리형 또는 외부 관리형 Iceberg v3 테이블을 쿼리합니다.

SELECT * FROM MY_DB.MY_SCHEMA.MY_ICEBERG_V3_TABLE;
Copy