동적 Apache Iceberg™ 테이블 생성
동적 Apache Iceberg™ 테이블 생성
동적 Apache Iceberg™ 테이블(dynamic Apache Iceberg table)은 출력을 Iceberg 형식으로 Snowflake 관리 외부 스토리지에 저장해요. 일반 동적 테이블과 같은 갱신 모드와 스케줄링을 지원하지만, Spark와 Trino 같은 외부 엔진이 데이터를 직접 읽을 수도 있어요.
출처: Snowflake 문서
본문
전체 구문 참조는 CREATE DYNAMIC ICEBERG TABLE 문서를 참조하세요.
사전 요구 사항
동적 Iceberg 테이블을 만들기 전에 외부 볼륨(external volume)을 설정하세요. 외부 볼륨은 Snowflake가 Iceberg 데이터와 메타데이터 파일을 쓰는 클라우드 스토리지 위치를 정의해요.
설정 지침은 외부 볼륨 구성 문서를 참조하세요.
Snowflake 관리 스토리지로 동적 Iceberg 테이블 생성
CREATE 문에는 Iceberg 전용 매개 변수 세 가지(EXTERNAL_VOLUME, CATALOG, BASE_LOCATION)가 필요해요. 다음 예시는 raw_orders 기본 테이블에서 읽는 동적 Iceberg 테이블을 생성해요.
CREATE OR REPLACE DYNAMIC ICEBERG TABLE dt_orders_iceberg
TARGET_LAG = '10 minutes'
WAREHOUSE = transform_wh
EXTERNAL_VOLUME = 'my_external_volume'
CATALOG = 'SNOWFLAKE'
BASE_LOCATION = 'dt_orders_iceberg'
REFRESH_MODE = INCREMENTAL
AS
SELECT
order_id,
customer_id,
order_date,
TRIM(UPPER(product_name)) AS product_name,
quantity,
unit_price,
quantity * unit_price AS line_total,
order_status
FROM raw_orders
WHERE order_status != 'returned';
Iceberg 테이블용 Snowflake 스토리지를 사용하려면 EXTERNAL_VOLUME, CATALOG, BASE_LOCATION을 생략할 수 있어요.
📌 Iceberg 테이블용 Snowflake 스토리지는 AWS와 Azure에서만 사용할 수 있어요. 정부 리전이나 중국 인민공화국에서는 사용할 수 없어요.
-- 위와 같은 정의이지만 명시적 스토리지 매개 변수 없이
CREATE OR REPLACE DYNAMIC ICEBERG TABLE dt_orders_iceberg_managed
TARGET_LAG = '10 minutes'
WAREHOUSE = transform_wh
-- EXTERNAL_VOLUME, CATALOG, BASE_LOCATION 불필요
REFRESH_MODE = INCREMENTAL
AS
SELECT ... FROM raw_orders ...;
-- 위 명시적 스토리지 예시와 동일한 컬럼
PARTITION_BY, TARGET_FILE_SIZE, PATH_LAYOUT을 포함한 전체 매개 변수 세부 정보는 CREATE DYNAMIC ICEBERG TABLE 문서를 참조하세요.
동적 Iceberg 테이블 확인
테이블이 존재하는지 확인하고 is_iceberg 플래그를 확인하세요:
SHOW DYNAMIC TABLES LIKE 'dt_orders_iceberg';
+--------------------+-----+--------------+------+------------------+------------+
| name | ... | refresh_mode | rows | scheduling_state | is_iceberg |
+--------------------+-----+--------------+------+------------------+------------+
| DT_ORDERS_ICEBERG | ... | INCREMENTAL | 4 | RUNNING | true |
+--------------------+-----+--------------+------+------------------+------------+
is_iceberg 컬럼은 동적 Iceberg 테이블에서 true, 일반 동적 테이블에서 false로 읽혀요.
동적 Iceberg 테이블이 없으면 만들고, 있으면 제자리에서 변경하려면 CREATE OR ALTER을 사용할 수도 있어요. 구문과 제한 사항은 CREATE OR ALTER DYNAMIC ICEBERG TABLE 문서를 참조하세요.
future grants로 접근 권한 부여
동적 Iceberg 테이블의 future grants는 ICEBERG TABLES가 아니라 DYNAMIC TABLES를 사용해요. 다음 구문은 스키마에서 생성되는 모든 동적 Iceberg 테이블에 권한을 부여해요.
GRANT <privilege> ON FUTURE DYNAMIC TABLES IN SCHEMA mydb.myschema TO ROLE transform_role;
ON FUTURE ICEBERG TABLES를 사용해도 동적 Iceberg 테이블에는 적용되지 않아요:
-- 이 구문은 동적 Iceberg 테이블에 접근 권한을 부여하지 않음:
GRANT <privilege> ON FUTURE ICEBERG TABLES IN SCHEMA mydb.myschema TO ROLE transform_role;
제한 사항
동적 Iceberg 테이블에는 추가 제한 사항이 있어요:
| 제한 사항 | 세부 내용 |
|---|---|
IF NOT EXISTS 미지원 |
IF NOT EXISTS 절은 지원되지 않아요. 사용하면 구문 오류가 발생해요. 대신 CREATE OR REPLACE를 사용하세요. |
ALTER DYNAMIC ICEBERG TABLE 없음 |
ALTER DYNAMIC ICEBERG TABLE은 명령으로 존재하지 않아요. 갱신 속성은 ALTER DYNAMIC TABLE을, 스토리지 속성은 ALTER ICEBERG TABLE을 사용하세요. |
| 클론 지원 | 동적 Iceberg 테이블을 새 동적 Iceberg 테이블 또는 Snowflake 관리 Iceberg 테이블로 클론할 수 있지만, 일반 테이블로는 클론할 수 없어요. 동적 Iceberg 테이블 클론 문서를 참조하세요. |
SNOWFLAKE 카탈로그만 |
CATALOG 매개 변수는 'SNOWFLAKE'여야 해요. 외부 카탈로그(Snowflake Open Catalog, AWS Glue)는 지원되지 않아요. |
| 백업 제외 | 동적 Iceberg 테이블은 데이터베이스나 스키마 백업에 포함되지 않아요. |
| 백필(backfill) 미지원 | 동적 Iceberg 테이블에 backfill을 사용하는 것은 지원되지 않아요. |
동적 Iceberg 테이블은 일반 Iceberg 테이블과 같은 데이터 타입을 지원해요. 전체 매핑은 지원되는 데이터 타입 문서를 참조하세요.
다음 단계
- 동적 테이블의 갱신 모드 알아보기: 동적 테이블 갱신 모드
- 갱신 기록 모니터링 및 실패 트러블슈팅: 동적 테이블 모니터링
- Iceberg 테이블 스토리지 옵션 이해하기: Apache Iceberg™ 테이블
- 스토리지 및 컴퓨팅 비용 고려 사항: 동적 테이블 비용 이해하기 문서 참조
- 갱신 쿼리 최적화: 증분 갱신용 쿼리 최적화 문서 참조