스파크 DDL
스파크 DDL
이 문서에서는 스파크에서 아이스버그를 사용할 때 쓸 수 있는 DDL 명령들을 알려드릴게요. CREATE TABLE, CTAS, RTAS, DROP TABLE, ALTER TABLE뿐 아니라 아이스버그 SQL 확장으로 제공되는 파티션 필드 추가/제거, 정렬 순서, 식별자 필드, 브랜치·태그 DDL, 그리고 아이스버그 뷰 관리까지 실제 SQL 예시와 함께 살펴볼게요.
출처: 문서
본문
스파크에서 아이스버그를 사용하려면 먼저 스파크 카탈로그를 구성해요. 아이스버그는 데이터 소스와 카탈로그 구현에 아파치 스파크의 DataSourceV2 API를 사용해요.
CREATE TABLE
Spark 3은 USING iceberg 절로 어떤 아이스버그 카탈로그에서든 테이블을 만들 수 있어요.
CREATE TABLE prod.db.sample (
id bigint NOT NULL COMMENT 'unique id',
data string)
USING iceberg;
아이스버그는 스파크의 컬럼 타입을 해당하는 아이스버그 타입으로 변환해요. 자세한 내용은 테이블 생성 시의 타입 호환성 섹션을 확인해주세요.
테이블 생성 명령(CTAS와 RTAS 포함)은 전체 스파크 create 절 범위를 지원해요.
- PARTITIONED BY (partition-expressions)로 파티셔닝 구성
- LOCATION '(fully-qualified-uri)'로 테이블 위치 설정
- COMMENT 'table documentation'으로 테이블 설명 설정
- TBLPROPERTIES ('key'='value', ...)로 테이블 구성 설정
Create 명령은 USING 절로 기본 포맷을 설정할 수도 있어요. 이것은 SparkCatalog에서만 지원돼요. 스파크가 내장 카탈로그에서 USING 절을 다르게 처리하기 때문이에요.
CREATE TABLE ... LIKE ... 구문은 지원되지 않아요.
PARTITIONED BY
파티션 테이블을 만들려면 PARTITIONED BY를 사용해요.
CREATE TABLE prod.db.sample (
id bigint,
data string,
category string)
USING iceberg
PARTITIONED BY (category);
PARTITIONED BY 절은 숨겨진 파티션을 만들기 위한 변환 표현식을 지원해요.
CREATE TABLE prod.db.sample (
id bigint,
data string,
category string,
ts timestamp)
USING iceberg
PARTITIONED BY (bucket(16, id), days(ts), category);
지원되는 변환은:
- year(ts): 연 단위 파티션
- month(ts): 월 단위 파티션
- day(ts) 또는 date(ts): dateint 파티셔닝과 동등
- hour(ts) 또는 date_hour(ts): dateint 및 hour 파티셔닝과 동등
- bucket(N, col): 해시 값 mod N 버킷으로 파티션
- truncate(L, col): L로 잘린 값으로 파티션. 문자열은 주어진 길이로 잘리고, 정수와 long은 빈으로 잘림: truncate(10, i)는 파티션 0, 10, 20, 30, ...을 생성
참고: 호환성을 위해 이전 구문인 years(ts), months(ts), days(ts), hours(ts)도 지원돼요.
같은 변환들은 system 네임스페이스 아래에 스파크 SQL 함수로도 사용할 수 있어요. 스파크 SQL 함수 참조.
CREATE TABLE ... AS SELECT
아이스버그는 SparkCatalog를 사용할 때 CTAS를 원자적 연산으로 지원해요. SparkSessionCatalog를 사용할 때 CTAS는 지원되지만 원자적이지 않아요.
CREATE TABLE prod.db.sample
USING iceberg
AS SELECT ...
새로 만들어진 테이블은 SELECT의 소스 테이블로부터 파티션 스펙과 테이블 속성을 상속하지 않아요. CTAS에서 PARTITIONED BY와 TBLPROPERTIES를 사용해서 새 테이블의 파티션 스펙과 테이블 속성을 선언할 수 있어요.
CREATE TABLE prod.db.sample
USING iceberg
PARTITIONED BY (part)
TBLPROPERTIES ('key'='value')
AS SELECT ...
REPLACE TABLE ... AS SELECT
아이스버그는 SparkCatalog를 사용할 때 RTAS를 원자적 연산으로 지원해요. SparkSessionCatalog를 사용할 때 RTAS는 지원되지만 원자적이지 않아요.
원자적 테이블 교체는 SELECT 쿼리 결과로 새 스냅샷을 만들지만 테이블 이력은 유지해요.
REPLACE TABLE prod.db.sample
USING iceberg
AS SELECT ...
REPLACE TABLE prod.db.sample
USING iceberg
PARTITIONED BY (part)
TBLPROPERTIES ('key'='value')
AS SELECT ...
CREATE OR REPLACE TABLE prod.db.sample
USING iceberg
AS SELECT ...
변경되면 스키마와 파티션 스펙이 교체돼요. 테이블의 스키마와 파티셔닝을 수정하지 않으려면 REPLACE TABLE 대신 INSERT OVERWRITE를 사용해요. REPLACE TABLE 명령의 새 테이블 속성은 기존 테이블 속성과 병합돼요. 기존 테이블 속성은 변경되면 업데이트되고, 그렇지 않으면 보존돼요.
DROP TABLE
DROP TABLE 동작은 0.14에서 바뀌었어요.
0.14 이전에는 DROP TABLE을 실행하면 카탈로그에서 테이블을 제거하고 테이블 내용도 함께 삭제했어요.
0.14부터는 DROP TABLE이 카탈로그에서 테이블만 제거해요. 테이블 내용을 삭제하려면 DROP TABLE PURGE를 사용해야 해요.
DROP TABLE
카탈로그에서 테이블을 드롭하려면 다음을 실행해요.
DROP TABLE prod.db.sample;
DROP TABLE PURGE
카탈로그에서 테이블을 드롭하고 테이블의 내용을 삭제하려면 다음을 실행해요.
DROP TABLE prod.db.sample PURGE;
ALTER TABLE
아이스버그는 Spark 3에서 완전한 ALTER TABLE 지원을 제공해요.
- 테이블 이름 변경
- 테이블 속성 설정 또는 제거
- 컬럼 추가, 삭제, 이름 변경
- 중첩 필드 추가, 삭제, 이름 변경
- 최상위 컬럼과 중첩 struct 필드 순서 변경
- int, float, decimal 필드 타입 확장
- 필수 컬럼을 선택적으로 만들기
또한 SQL 확장을 사용해서 파티션 진화 지원과 테이블 쓰기 순서 설정을 추가할 수 있어요.
Hive 카탈로그 제한 (Hive Catalog Limitation)
Hive Metastore(HMS)는 컬럼 타입을 위치적으로 비교해서 스키마 변경을 검증해요(hive.metastore.disallow.incompatible.col.type.changes, 기본값 true). Hive 카탈로그를 사용할 때 컬럼 위치를 바꾸는 어떤 스키마 진화 연산도 실패해요. 영향받는 연산은 다음과 같아요.
- FIRST 또는 AFTER 절이 있는 ADD COLUMN
- FIRST 또는 AFTER 절이 있는 ALTER COLUMN (재정렬)
- 마지막이 아닌 컬럼의 DROP COLUMN
이를 우회하려면 hive.metastore.disallow.incompatible.col.type.changes=false로 설정해서 HMS 스키마 호환성 검사를 비활성화해요.
- 원격 HMS: HMS 서버의 hive-site.xml에 이 속성을 설정해요.
- 임베디드 HMS: 스파크를 시작할 때 --conf spark.hadoop.hive.metastore.disallow.incompatible.col.type.changes=false를 전달해요.
트레이드오프: 이 검사를 비활성화한 후에는 Hive Metastore의 스키마 불일치로 인해 Hive 엔진이 테이블을 올바르게 읽지 못할 수 있어요. 아이스버그를 아는 엔진(Spark, Flink, Trino 등)은 HMS가 아니라 아이스버그 메타데이터에서 스키마를 읽으므로 계속 올바르게 동작해요.
ALTER TABLE ... RENAME TO
ALTER TABLE prod.db.sample RENAME TO prod.db.new_name;
ALTER TABLE ... SET TBLPROPERTIES
ALTER TABLE prod.db.sample SET TBLPROPERTIES (
'read.split.target-size'='268435456'
);
아이스버그는 테이블 속성을 사용해 테이블 동작을 제어해요. 사용 가능한 속성 목록은 테이블 구성(Table configuration)을 참고해주세요.
UNSET은 속성을 제거하는 데 사용돼요.
ALTER TABLE prod.db.sample UNSET TBLPROPERTIES ('read.split.target-size');
SET TBLPROPERTIES는 테이블 주석(설명)을 설정하는 데도 사용할 수 있어요.
ALTER TABLE prod.db.sample SET TBLPROPERTIES (
'comment' = 'A table comment.'
);
ALTER TABLE ... ADD COLUMN
아이스버그에 컬럼을 추가하려면 ALTER TABLE과 함께 ADD COLUMNS 절을 사용해요.
ALTER TABLE prod.db.sample
ADD COLUMNS (
new_column string comment 'new_column docs'
);
여러 컬럼을 쉼표로 구분해 동시에 추가할 수 있어요.
중첩 컬럼은 전체 컬럼 이름으로 식별해야 해요.
-- create a struct column
ALTER TABLE prod.db.sample
ADD COLUMN point struct<x: double, y: double>;
-- add a field to the struct
ALTER TABLE prod.db.sample
ADD COLUMN point.z double;
-- create a nested array column of struct
ALTER TABLE prod.db.sample
ADD COLUMN points array<struct<x: double, y: double>>;
-- add a field to the struct within an array. Using keyword 'element' to access the array's element column.
ALTER TABLE prod.db.sample
ADD COLUMN points.element.z double;
-- create a map column of struct key and struct value
ALTER TABLE prod.db.sample
ADD COLUMN points map<struct<x: int>, struct<a: int>>;
-- add a field to the value struct in a map. Using keyword 'value' to access the map's value column.
ALTER TABLE prod.db.sample
ADD COLUMN points.value.b int;
참고: map 'key' 컬럼을 컬럼 추가로 변경하는 것은 허용되지 않아요. map 값만 업데이트할 수 있어요.
FIRST 또는 AFTER 절을 추가해서 어떤 위치에든 컬럼을 추가해요.
ALTER TABLE prod.db.sample
ADD COLUMN new_column bigint AFTER other_column;
ALTER TABLE prod.db.sample
ADD COLUMN nested.new_column bigint FIRST;
Hive 카탈로그 제한 (Hive Catalog Limitation)
Hive 카탈로그를 사용할 때 FIRST 또는 AFTER로 컬럼을 추가하면 HMS 위치 기반 스키마 검증 때문에 실패할 수 있어요. 자세한 내용과 우회책은 위의 경고를 참고해주세요.
ALTER TABLE ... RENAME COLUMN
아이스버그는 어떤 필드든 이름을 바꿀 수 있어요. 필드 이름을 바꾸려면 RENAME COLUMN을 사용해요.
ALTER TABLE prod.db.sample RENAME COLUMN data TO payload;
ALTER TABLE prod.db.sample RENAME COLUMN location.lat TO latitude;
중첩 rename 명령은 리프 필드만 이름을 바꾼다는 점에 유의해주세요. 위 명령은 location.lat을 location.latitude로 바꿔요.
ALTER TABLE ... ALTER COLUMN
Alter column은 타입을 확장하고, 필드를 선택적으로 만들고, 주석을 설정하고, 필드를 재정렬하는 데 사용돼요.
아이스버그는 업데이트가 안전할 때 컬럼 타입 업데이트를 허용해요. 안전한 업데이트는:
- int에서 bigint로
- float에서 double로
- decimal(P,S)에서 P2 > P일 때 decimal(P2,S)로 (스케일은 변경 불가)
ALTER TABLE prod.db.sample ALTER COLUMN measurement TYPE double;
struct에서 컬럼을 추가하거나 제거하려면 중첩 컬럼 이름으로 ADD COLUMN 또는 DROP COLUMN을 사용해요.
컬럼 주석도 ALTER COLUMN으로 업데이트할 수 있어요.
ALTER TABLE prod.db.sample ALTER COLUMN measurement TYPE double COMMENT 'unit is bytes per second';
ALTER TABLE prod.db.sample ALTER COLUMN measurement COMMENT 'unit is kilobytes per second';
아이스버그는 FIRST와 AFTER 절을 사용해 최상위 컬럼이나 struct의 컬럼을 재정렬하는 것을 허용해요.
ALTER TABLE prod.db.sample ALTER COLUMN col FIRST;
ALTER TABLE prod.db.sample ALTER COLUMN nested.col AFTER other_col;
Hive 카탈로그 제한 (Hive Catalog Limitation)
Hive 카탈로그를 사용할 때 컬럼을 재정렬하면 HMS 위치 기반 스키마 검증 때문에 실패할 수 있어요. 자세한 내용과 우회책은 위의 Hive 카탈로그 제한 주의사항을 참고해주세요.
non-nullable 컬럼의 null 허용 여부는 DROP NOT NULL로 변경할 수 있어요.
ALTER TABLE prod.db.sample ALTER COLUMN id DROP NOT NULL;
정보 (Info)
SET NOT NULL로 nullable 컬럼을 non-nullable로 변경하는 것은 불가능해요. 아이스버그는 null 값을 가진 기존 데이터가 있는지 알지 못하기 때문이에요.
정보 (Info)
ALTER COLUMN은 struct 타입을 업데이트하는 데 사용되지 않아요. struct 필드를 추가하거나 제거하려면 ADD COLUMN과 DROP COLUMN을 사용해주세요.
ALTER TABLE ... DROP COLUMN
컬럼을 드롭하려면 ALTER TABLE ... DROP COLUMN을 사용해요.
ALTER TABLE prod.db.sample DROP COLUMN id;
ALTER TABLE prod.db.sample DROP COLUMN point.z;
Hive 카탈로그 제한 (Hive Catalog Limitation)
Hive 카탈로그를 사용할 때 마지막이 아닌 컬럼을 드롭하면 HMS 위치 기반 스키마 검증 때문에 실패할 수 있어요. 자세한 내용과 우회책은 앞선 Hive 카탈로그 제한 경고를 참고해주세요.
ALTER TABLE SQL 확장 (ALTER TABLE SQL extensions)
이 명령들은 아이스버그 SQL 확장을 사용할 때 Spark 3에서 사용할 수 있어요.
ALTER TABLE ... ADD PARTITION FIELD
아이스버그는 ADD PARTITION FIELD를 사용해 스펙에 새 파티션 필드를 추가하는 것을 지원해요.
ALTER TABLE prod.db.sample ADD PARTITION FIELD catalog; -- identity transform
파티션 변환도 지원돼요.
ALTER TABLE prod.db.sample ADD PARTITION FIELD bucket(16, id);
ALTER TABLE prod.db.sample ADD PARTITION FIELD truncate(4, data);
ALTER TABLE prod.db.sample ADD PARTITION FIELD year(ts);
-- use optional AS keyword to specify a custom name for the partition field
ALTER TABLE prod.db.sample ADD PARTITION FIELD bucket(16, id) AS shard;
파티션 필드 추가는 메타데이터 연산이고 기존 테이블 데이터를 변경하지 않아요. 새 데이터는 새 파티셔닝으로 쓰여지고, 기존 데이터는 이전 파티션 레이아웃에 남아요. 구 데이터 파일은 메타데이터 테이블에서 새 파티션 필드에 대해 null 값을 가져요.
테이블 파티셔닝이 변하면 동적 파티션 overwrite가 파티션을 암시적으로 교체하므로 동적 파티션 overwrite 동작이 바뀌어요. 명시적으로 덮어쓰려면 새 DataFrameWriterV2 API를 사용해주세요.
참고 (Note)
변환을 사용해 일 단위에서 시 단위 파티셔닝으로 마이그레이션할 때, 일 단위 파티션 필드를 드롭할 필요는 없어요. 필드를 유지하면 기존 메타데이터 테이블 쿼리가 계속 동작하는 것을 보장해요.
위험 (Danger)
파티셔닝이 변하면 동적 파티션 overwrite 동작이 바뀌어요. 예를 들어 일 단위로 파티셔닝하다가 시 단위 파티셔닝으로 옮기면, overwrite는 더 이상 일 단위가 아닌 시 단위 파티션을 덮어써요.
ALTER TABLE ... DROP PARTITION FIELD
파티션 필드는 DROP PARTITION FIELD를 사용해 제거할 수 있어요.
ALTER TABLE prod.db.sample DROP PARTITION FIELD catalog;
ALTER TABLE prod.db.sample DROP PARTITION FIELD bucket(16, id);
ALTER TABLE prod.db.sample DROP PARTITION FIELD truncate(4, data);
ALTER TABLE prod.db.sample DROP PARTITION FIELD year(ts);
ALTER TABLE prod.db.sample DROP PARTITION FIELD shard;
파티션이 제거되더라도 컬럼은 여전히 테이블 스키마에 존재한다는 점에 유의해주세요.
파티션 필드 드롭은 메타데이터 연산이고 기존 테이블 데이터를 변경하지 않아요. 새 데이터는 새 파티셔닝으로 쓰여지고 기존 데이터는 이전 파티션 레이아웃에 남아요.
위험 (Danger)
파티셔닝이 변하면 동적 파티션 overwrite 동작이 바뀌어요. 예를 들어 일 단위로 파티셔닝하다가 시 단위 파티셔닝으로 옮기면, overwrite는 더 이상 일 단위가 아닌 시 단위 파티션을 덮어써요.
위험 (Danger)
파티션 필드를 드롭할 때 주의하세요. files 같은 메타데이터 테이블의 스키마가 바뀌고 메타데이터 쿼리가 실패하거나 다른 결과를 만들 수 있어요.
ALTER TABLE ... REPLACE PARTITION FIELD
REPLACE PARTITION FIELD를 사용하면 단일 메타데이터 업데이트에서 파티션 필드를 새 파티션 필드로 교체할 수 있어요.
ALTER TABLE prod.db.sample REPLACE PARTITION FIELD ts_day WITH day(ts);
-- use optional AS keyword to specify a custom name for the new partition field
ALTER TABLE prod.db.sample REPLACE PARTITION FIELD ts_day WITH day(ts) AS day_of_ts;
ALTER TABLE ... WRITE ORDERED BY
아이스버그 테이블은 일부 엔진에서 테이블에 쓰여지는 데이터를 자동으로 정렬하는 데 사용되는 정렬 순서로 구성될 수 있어요. 예를 들어 스파크의 MERGE INTO는 테이블 정렬을 사용해요.
테이블의 쓰기 순서를 설정하려면 WRITE ORDERED BY를 사용해요.
ALTER TABLE prod.db.sample WRITE ORDERED BY category, id
-- use optional ASC/DESC keyword to specify sort order of each field (default ASC)
ALTER TABLE prod.db.sample WRITE ORDERED BY category ASC, id DESC
-- use optional NULLS FIRST/NULLS LAST keyword to specify null order of each field (default FIRST)
ALTER TABLE prod.db.sample WRITE ORDERED BY category ASC NULLS LAST, id DESC NULLS FIRST
정보 (Info)
테이블 쓰기 순서는 쿼리에 대한 데이터 순서를 보장하지 않아요. 테이블에 데이터가 어떻게 쓰여지는지에만 영향을 줘요.
WRITE ORDERED BY는 INSERT 명령에서 ORDER BY를 사용하는 것처럼 행이 작업 전체에 걸쳐 정렬되는 전역 정렬을 설정해요.
INSERT INTO prod.db.sample
SELECT id, data, category, ts FROM another_table
ORDER BY ts, category
작업 전체가 아니라 각 작업 내에서 정렬하려면 LOCALLY ORDERED BY를 사용해요.
ALTER TABLE prod.db.sample WRITE LOCALLY ORDERED BY category, id
테이블의 정렬 순서를 해제하려면 UNORDERED를 사용해요.
ALTER TABLE prod.db.sample WRITE UNORDERED
ALTER TABLE ... WRITE DISTRIBUTED BY PARTITION
WRITE DISTRIBUTED BY PARTITION은 각 파티션이 하나의 작성자에 의해 처리되도록 요청하는데, 기본 구현은 hash 분포예요.
ALTER TABLE prod.db.sample WRITE DISTRIBUTED BY PARTITION
DISTRIBUTED BY PARTITION과 LOCALLY ORDERED BY를 함께 사용해서, 파티션으로 분포하고 각 작업 내에서 행을 로컬 정렬할 수 있어요.
ALTER TABLE prod.db.sample WRITE DISTRIBUTED BY PARTITION LOCALLY ORDERED BY category, id
ALTER TABLE ... SET IDENTIFIER FIELDS
아이스버그는 SET IDENTIFIER FIELDS로 스펙에 식별자 필드를 설정하는 것을 지원해요. 테이블에 식별자 필드가 있으면 스파크 테이블이 Flink SQL upsert 연산을 지원할 수 있어요.
ALTER TABLE prod.db.sample SET IDENTIFIER FIELDS id
-- single column
ALTER TABLE prod.db.sample SET IDENTIFIER FIELDS id, data
-- multiple columns
식별자 필드는 생성되거나 추가될 때 NOT NULL 컬럼이어야 해요. 이후의 ALTER 문은 이전 설정을 덮어써요.
ALTER TABLE ... DROP IDENTIFIER FIELDS
식별자 필드는 DROP IDENTIFIER FIELDS로 제거할 수 있어요.
ALTER TABLE prod.db.sample DROP IDENTIFIER FIELDS id
-- single column
ALTER TABLE prod.db.sample DROP IDENTIFIER FIELDS id, data
-- multiple columns
식별자가 제거되더라도 컬럼은 여전히 테이블 스키마에 존재한다는 점에 유의해주세요.
브랜칭과 태깅 DDL (Branching and Tagging DDL)
ALTER TABLE ... CREATE BRANCH
다음 옵션으로 CREATE BRANCH 문을 통해 브랜치를 만들 수 있어요.
- IF NOT EXISTS로 브랜치가 이미 있으면 실패하지 않기
- CREATE OR REPLACE로 브랜치가 이미 있으면 업데이트
- 특정 스냅샷에서 브랜치 만들기
- 지정된 보존 기간으로 브랜치 만들기
-- CREATE audit-branch at current snapshot with default retention.
ALTER TABLE prod.db.sample CREATE BRANCH `audit-branch`
-- CREATE audit-branch at current snapshot with default retention if it doesn't exist.
ALTER TABLE prod.db.sample CREATE BRANCH IF NOT EXISTS `audit-branch`
-- CREATE audit-branch at current snapshot with default retention or REPLACE it if it already exists.
ALTER TABLE prod.db.sample CREATE OR REPLACE BRANCH `audit-branch`
-- CREATE audit-branch at snapshot 1234 with default retention.
ALTER TABLE prod.db.sample CREATE BRANCH `audit-branch`
AS OF VERSION 1234
-- CREATE audit-branch at snapshot 1234, retain audit-branch for 30 days, and retain the latest 30 days. The latest 3 snapshot snapshots, and 2 days worth of snapshots.
ALTER TABLE prod.db.sample CREATE BRANCH `audit-branch`
AS OF VERSION 1234 RETAIN 30 DAYS
WITH SNAPSHOT RETENTION 3 SNAPSHOTS 2 DAYS
ALTER TABLE ... CREATE TAG
다음 옵션으로 CREATE TAG 문을 통해 태그를 만들 수 있어요.
- IF NOT EXISTS로 태그가 이미 있으면 실패하지 않기
- CREATE OR REPLACE로 태그가 이미 있으면 업데이트
- 특정 스냅샷에서 태그 만들기
- 지정된 보존 기간으로 태그 만들기
-- CREATE historical-tag at current snapshot with default retention.
ALTER TABLE prod.db.sample CREATE TAG `historical-tag`
-- CREATE historical-tag at current snapshot with default retention if it doesn't exist.
ALTER TABLE prod.db.sample CREATE TAG IF NOT EXISTS `historical-tag`
-- CREATE historical-tag at current snapshot with default retention or REPLACE it if it already exists.
ALTER TABLE prod.db.sample CREATE OR REPLACE TAG `historical-tag`
-- CREATE historical-tag at snapshot 1234 with default retention.
ALTER TABLE prod.db.sample CREATE TAG `historical-tag` AS OF VERSION 1234
-- CREATE historical-tag at snapshot 1234 and retain it for 1 year.
ALTER TABLE prod.db.sample CREATE TAG `historical-tag`
AS OF VERSION 1234 RETAIN 365 DAYS
ALTER TABLE ... REPLACE BRANCH
브랜치가 참조하는 스냅샷은 REPLACE BRANCH sql로 업데이트할 수 있어요. 이 문에서 보존도 업데이트할 수 있어요.
-- REPLACE audit-branch to reference snapshot 4567 and update the retention to 60 days.
ALTER TABLE prod.db.sample REPLACE BRANCH `audit-branch`
AS OF VERSION 4567 RETAIN 60 DAYS
ALTER TABLE ... REPLACE TAG
태그가 참조하는 스냅샷은 REPLACE TAG sql로 업데이트할 수 있어요. 이 문에서 보존도 업데이트할 수 있어요.
-- REPLACE historical-tag to reference snapshot 4567 and update the retention to 60 days.
ALTER TABLE prod.db.sample REPLACE TAG `historical-tag`
AS OF VERSION 4567 RETAIN 60 DAYS
ALTER TABLE ... DROP BRANCH
브랜치는 DROP BRANCH sql로 제거할 수 있어요.
ALTER TABLE prod.db.sample DROP BRANCH `audit-branch`
ALTER TABLE ... DROP TAG
태그는 DROP TAG sql로 제거할 수 있어요.
ALTER TABLE prod.db.sample DROP TAG `historical-tag`
스파크의 아이스버그 뷰 (Iceberg views in Spark)
아이스버그 뷰는 여러 쿼리 엔진에서 해석되는 것을 목표로 하는 SQL 뷰의 공통 표현이에요. 이 섹션에서는 Spark 3.4 이상(이전 스파크 버전은 지원되지 않음)을 사용해 스파크에서 뷰를 만들고 관리하는 방법을 다뤄요.
참고 (Note)
이 섹션의 모든 SQL 예시는 공식 스파크 SQL 구문을 따르는 것을 목표로 해요.
- CREATE VIEW
- ALTER VIEW
- DROP VIEW
- SHOW VIEWS
- SHOW TBLPROPERTIES
- SHOW CREATE TABLE
뷰 만들기 (Creating a view)
주석이나 속성 없이 간단한 뷰를 만들어요:
CREATE VIEW <viewName> AS SELECT * FROM <tableName>
IF NOT EXISTS를 사용하면 뷰가 이미 있을 때 SQL 문이 실패하지 않아요:
CREATE VIEW IF NOT EXISTS <viewName> AS SELECT * FROM <tableName>
소스 테이블과 다른 별칭과 주석이 있는 컬럼을 포함해 주석으로 뷰를 만들어요:
CREATE VIEW <viewName> (ID COMMENT 'Unique ID', ZIP COMMENT 'Zipcode')
COMMENT 'View Comment'
AS SELECT id, zip FROM <tableName>
속성으로 뷰 만들기 (Creating a view with properties)
TBLPROPERTIES로 속성을 가진 뷰를 만들어요:
CREATE VIEW <viewName>
TBLPROPERTIES ('key1' = 'val1', 'key2' = 'val2')
AS SELECT * FROM <tableName>
뷰 속성을 표시해요:
SHOW TBLPROPERTIES <viewName>
위치로 뷰 만들기 (Creating a view with location)
뷰 메타데이터 위치를 지정하려면 TBLPROPERTIES ('location'='fully-qualified-uri')를 사용해요:
CREATE VIEW <viewName>
TBLPROPERTIES ('location' = '/path/to/custom-location')
AS SELECT * FROM <tableName>
뷰 메타데이터는 지정된 위치에 /metadata가 추가된 곳에 저장돼요. 예: /path/to/custom-location/metadata.
뷰 드롭 (Dropping a view)
기존 뷰를 드롭해요:
DROP VIEW <viewName>
IF EXISTS를 사용하면 뷰가 없을 때 SQL 문이 실패하지 않아요:
DROP VIEW IF EXISTS <viewName>
뷰 교체 (Replacing a view)
CREATE OR REPLACE를 사용해서 뷰의 스키마, 속성, 기본 SQL 문을 업데이트해요:
CREATE OR REPLACE VIEW <viewName> (updated_id COMMENT 'updated ID')
TBLPROPERTIES ('key1' = 'new_val1')
AS SELECT id FROM <tableName>
뷰 속성 설정과 제거 (Setting and removing view properties)
ALTER VIEW ... SET TBLPROPERTIES로 기존 뷰의 속성을 설정해요:
ALTER VIEW <viewName> SET TBLPROPERTIES ('key1' = 'val1', 'key2' = 'val2')
ALTER VIEW ... UNSET TBLPROPERTIES로 기존 뷰의 속성을 제거해요:
ALTER VIEW <viewName> UNSET TBLPROPERTIES ('key1', 'key2')
사용 가능한 뷰 보기 (Showing available views)
현재 설정된 네임스페이스의 모든 뷰를 나열해요 (USE
SHOW VIEWS
정의된 카탈로그 및/또는 네임스페이스의 사용 가능한 모든 뷰를 아래 변형 중 하나로 나열해요:
SHOW VIEWS IN <catalog>
SHOW VIEWS IN <namespace>
SHOW VIEWS IN <catalog>.<namespace>
뷰의 CREATE 문 보기 (Showing the CREATE statement of a view)
뷰의 CREATE 문을 보여줘요:
SHOW CREATE TABLE <viewName>
뷰 세부사항 표시 (Displaying view details)
DESCRIBE로 추가 뷰 세부사항을 표시해요:
DESCRIBE [EXTENDED] <viewName>