Developers Haven

(DH)블로그는 개발자들이 기술 정보를 찾아볼 수 있는 안식처가 되고 싶음을 희망하여 시작하게 되었습니다. 공부한 내용과 성장 과정을 기록해두었으니 편히 둘러보시길 바랍니다.

Welcome to DH's Blog

[기술공부]/Data

Apache Iceberg DDL 쿼리 사용법 - Create and Alter Table

DH’s Blog 2023. 10. 13. 15:09
반응형

이번에는 Iceberg 테이블 포맷에서의 테이블을 만들고 변경하는 DDL 쿼리 구문에 대해 알아보도록 하자. 참고로 나는 Spark에서 Iceberg 테이블을 사용하는 기준으로 쿼리를 정리했으므로, Spark가 아닌 다른 엔진을 사용하는 경우에는 공식 문서를 참조하도록 하자.

 


<Table DDL(Data Definition Language)>

# Create

1. Schema 생성

CREATE DATABASE IF NOT EXISTS [스키마];  -- IF NOT EXISTS : 해당 스키마가 존재하지 않는 경우에만 CREATE 쿼리문을 실행하도록 만드는 조건으로, 생략 가능하다.

 

2. Table 생성

(1) 파티션 유무에 따른 DDL문

case1) 파티션이 없는 경우

-- Iceberg
CREATE TABLE [스키마].[테이블명] (
		id bigint COMMENT 'id값', -- COMMENT는 해당 컬럼에 대한 설명을 나타내며 생략해도 된다.
		name string COMMENT '이름')
USING ICEBERG     -- Iceberg 테이블을 만들려면 'using iceberg' 구문 필요

 

case2) 파티션이 있는 경우

PARTITIONED BY 설정을 통해 파티션 지정이 가능하며, 두 개 이상의 다중 파티션 지정도 가능하다.

-- case1. 파티션이 하나인 경우
CREATE TABLE [스키마].[테이블명] (
		id bigint COMMENT 'id값',
		name string COMMENT '이름',
		etl_ymd string COMMENT '기록일자')
USING ICEBERG
PARTITIONED BY (etl_ymd)


-- case2. 파티션이 여러개인 경우
CREATE TABLE [스키마].[테이블명] (
		id bigint COMMENT 'id값',
		name string COMMENT '이름',
		category string COMMENT '분류기준',
		etl_ymd string COMMENT '기록일자')
USING ICEBERG
PARTITIONED BY (category, etl_ymd)

 

 

(2) 테이블 관련 속성 설정

Iceberg 테이블 생성시, 아래 옵션을 추가해서 본인이 원하는대로 테이블을 만들 수 있다.

TBLPROPERTIES 설정은 read, write 방식 등을 지정할 수 있게 해주며 옵션이 여러개 있으므로 아래 페이지를 참고하도록 하자.

https://iceberg.apache.org/docs/latest/configuration/

 

Configuration

Configuration Table properties Iceberg tables support table properties to configure table behavior, like the default split size for readers. Read properties PropertyDefaultDescriptionread.split.target-size134217728 (128 MB)Target size when combining data i

iceberg.apache.org

-- Iceberg
CREATE TABLE [스키마].[테이블명] (
		id bigint COMMENT 'id값',
		name string COMMENT '이름',
		etl_ymd string COMMENT '기록일자')
USING ICEBERG
PARTITIONED BY (etl_ymd) -- PARTITIONED BY : 파티션 설정 옵션
COMMENT '테이블에 대한 설명' -- 해당 테이블을 설명하는 코멘트 설정 옵션
LOCATION '저장경로' -- 해당 테이블이 저장되는 경로 설정 옵션
TBLPROPERTIES (
	'write.format.default' = 'orc',
	'format-version' = '2') -- 테이블 관련 설정 옵션

 

 

 


# Alter (Table, Column 변경 옵션)

1. 테이블명 / 테이블 설명 수정

-- 테이블명 수정
ALTER TABLE [스키마].[테이블명] RENAME TO [스키마].[신규테이블명];

-- 테이블 옵션 수정(예시는 테이블 설명을 수정하는 상황으로 가정)
ALTER TABLE [스키마].[테이블명] SET TBLPROPERTIES ('comment' = '신규테이블설명');

 

 

2. 컬럼명 변경 / 컬럼 옵션 변경 / 컬럼 추가 및 제거

-- 기존 컬럼명 변경
ALTER TABLE [스키마].[테이블명] RENAME COLUMN [기존컬럼명] TO [신규컬럼명];

-- 기존 컬럼 옵션 및 순서 변경
ALTER TABLE [스키마].[테이블명] ALTER COLUMN [컬럼명] TYPE '변경할데이터타입'; -- int to bigint / float to double
ALTER TABLE [스키마].[테이블명] ALTER COLUMN [컬럼명] COMMENT '변경할컬럼설명';
ALTER TABLE [스키마].[테이블명] ALTER COLUMN [컬럼명] FIRST; -- 컬럼을 첫번째 순서로 변경
ALTER TABLE [스키마].[테이블명] ALTER COLUMN [컬럼명] AFTER [컬럼명2]; -- 컬럼명2 다음순서로 변경

-- 컬럼 추가(추가시 컬럼 위치도 설정 가능)
ALTER TABLE [스키마].[테이블명] ADD COLUMNS [신규컬럼명] [신규컬럼데이터타입] COMMENT '신규컬럼설명'; -- 신규컬럼 생성(마지막 컬럼으로 생성)
ALTER TABLE [스키마].[테이블명] ADD COLUMNS [신규컬럼명] [신규컬럼데이터타입] COMMENT '신규컬럼설명' FIRST; -- 신규컬럼을 가장 첫번째 순서로 생성
ALTER TABLE [스키마].[테이블명] ADD COLUMNS [신규컬럼명] [신규컬럼데이터타입] COMMENT '신규컬럼설명' AFTER [컬럼명2]; -- 신규컬럼을 컬럼명2 다음순서에 생성

-- 컬럼 제거
ALTER TABLE [스키마].[테이블명] DROP COLUMNS [삭제컬럼명];

 

3. 파티션 컬럼 추가 및 제거

-- 파티션 컬럼 추가
-- 주의1.신규 파티션 컬럼추가 전에, 해당 컬럼이 미리 만들어져있어야 한다.
-- 주의2.파티션이 추가되면 메타에만 반영되고, 추가하기 전의 데이터는 그대로 유지되어서 추가된 파티션 컬럼값은 NULL로 대체된다.
ALTER TABLE [스키마].[테이블명] ADD PARTITION FIELD [신규파티션컬럼명];

-- 파티션 컬럼 제거
-- 주의1.아래 명령은 메타에만 반영될뿐, 실제 테이블 데이터에는 변화가 없으므로 주의가 필요하다.
ALTER TABLE [스키마].[테이블명] DROP PARTITION FIELD [삭제파티션컬럼명];

 

 

 


# Drop (Table 제거)

22년에 배포한 0.14.0 버전까지는 DROP TABLE 실행을 통해 메타와 데이터를 모두 지울 수 있었다. 이후 배포부터는 DROP TABLE 실행으로 메타만 삭제되고 실제 데이터 파일은 남아있게 되었는데, 이때 데이터 파일까지 함께 삭제해주기 위해서 'PURGE' 옵션이 필요해졌다. (참고로 글을 작성한 23년 10월 기준으로는 1.4.0 버전까지 배포되었다)

-- 메타 & data file 제거
DROP TABLE IF EXISTS [스키마].[테이블명] PURGE; -- IF EXISTS : 해당 테이블이 실제로 존재하는 경우에만 쿼리문을 실행하도록 만드는 조건으로, 생략 가능하다.

 

 

 

 


 

 

지금까지 Iceberg 테이블의 DDL문을 살펴보았고, 기존에 사용하던 쿼리문과 많이 비슷함을 느낄 수 있었다. 위 내용은 실제 현업에서 근무하며 가장 많이 사용했던 쿼리문을 정리해본 것이며 추가적인 내용에 대해서는 아래 공식문서 사이트를 참고하는 것을 추천한다. 그럼 다음 시간에는 실제 데이터 레코드 사용에 필요한 DML문에 대해서 알아보도록 하자.

 

 

참고 사이트(Iceberg 공식문서) - https://iceberg.apache.org/docs/latest/spark-ddl/

 

 

반응형