Trino 는 카탈로그 파일에서 커넥터를 정한다. etc/catalog/iceberg.properties 를 만들면 iceberg 라는 카탈로그가 생긴다.
connector.name=iceberg
iceberg.catalog.type=hive_metastore
hive.metastore.uri=thrift://metastore01:9083
fs.hadoop.enabled=true
fs.hadoop.enabled=true 는 HDFS 접근을 켜는 스위치이며 기본값은 false 다. S3 를 쓴다면 대신 fs.native-s3.enabled=true 와 관련 속성을 설정한다.
테이블을 참조할 때는 항상 카탈로그.스키마.테이블 세 단계다. 카탈로그를 빼면 no catalog 오류가 난다.
SHOW CATALOGS;
USE iceberg.my_schema;
SELECT * FROM iceberg.my_schema.my_table;
CREATE TABLE iceberg.my_schema.events (
id BIGINT,
name VARCHAR,
updated_at TIMESTAMP(6)
)
WITH (
format = 'PARQUET',
format_version = 2,
partitioning = ARRAY['day(updated_at)']
);
| 속성 | 뜻 |
|---|---|
format |
데이터 파일 형식. PARQUET(기본) · ORC · AVRO |
format_version |
Iceberg 스펙 버전. 최신 Trino 의 기본값은 2 |
partitioning |
파티션 변환 배열. day(col), bucket(col, n) 등 |
sorted_by |
파일 안 정렬 기준 컬럼 |
location |
테이블 위치. 스키마 위치 아래 기본 경로가 정해진다 |
format = 'iceberg' 라고 적는 것은 잘못이다. 어떤 커넥터를 쓸지는 카탈로그가 정하고, format 은 데이터 파일 형식을 뜻한다.
스키마에 위치가 지정돼 있으면 테이블마다 location 을 적을 필요가 없다.
CREATE SCHEMA iceberg.my_schema WITH (location = 's3://bucket/warehouse/my_schema');
CREATE TABLE iceberg.my_schema.summary
WITH (format_version = 2, partitioning = ARRAY['month(order_date)'])
AS
SELECT order_date, customer_id, SUM(total_price) AS amount
FROM iceberg.my_schema.orders
GROUP BY order_date, customer_id;
Trino 는 v2 테이블에서 DELETE, UPDATE, MERGE 를 지원하며, 행 단위 삭제는 position delete 파일을 쓰는 방식으로 처리한다. 이 동작을 켜고 끄는 write_delete_mode 같은 테이블 속성은 Trino 쪽에 없다. 다른 엔진(Spark)에서 설정한 write.delete.mode 테이블 속성이 있더라도 Trino 의 동작은 커넥터 구현을 따른다.
DELETE FROM iceberg.my_schema.events WHERE id = 100;
MERGE INTO iceberg.my_schema.events AS t
USING staging AS s ON t.id = s.id
WHEN MATCHED THEN UPDATE SET name = s.name
WHEN NOT MATCHED THEN INSERT (id, name, updated_at) VALUES (s.id, s.name, s.updated_at);
delete 파일이 쌓이면 읽기가 느려지므로 정리한다.
ALTER TABLE iceberg.my_schema.events EXECUTE optimize;
ALTER TABLE iceberg.my_schema.events EXECUTE expire_snapshots(retention_threshold => '7d');
ALTER TABLE iceberg.my_schema.events EXECUTE remove_orphan_files(retention_threshold => '7d');
| Iceberg | Trino |
|---|---|
boolean |
BOOLEAN |
int |
INTEGER |
long |
BIGINT |
float |
REAL |
double |
DOUBLE |
decimal(p,s) |
DECIMAL(p,s) |
date |
DATE |
timestamp |
TIMESTAMP(6) |
timestamptz |
TIMESTAMP(6) WITH TIME ZONE |
string |
VARCHAR |
binary |
VARBINARY |
STRING 은 Trino 타입이 아니다. VARCHAR 를 쓴다.