Hive 의 INSERT OVERWRITE TABLE ... SELECT ... 는 Trino 에서 파싱되지 않는다. Trino 는 ANSI SQL 문법을 따르므로 같은 효과를 다른 방법으로 낸다. 대상이 파티션 테이블인지 아닌지에 따라 방법이 갈린다.
Hive 커넥터는 이미 존재하는 파티션에 INSERT 했을 때의 동작을 설정으로 바꿀 수 있다. 이것이 Trino 가 제공하는 덮어쓰기다.
| 값 | 동작 |
|---|---|
APPEND |
기존 파티션에 파일을 덧붙인다 (기본값) |
OVERWRITE |
대상 파티션의 기존 데이터를 지우고 새로 쓴다 |
ERROR |
기존 파티션이 있으면 쿼리를 실패시킨다 |
카탈로그 전체에 적용하려면 hive.insert-existing-partitions-behavior 를 카탈로그 속성에 넣고, 세션에서만 바꾸려면 세션 속성을 쓴다. 세션 속성은 카탈로그 이름으로 한정해야 한다.
SET SESSION hive.insert_existing_partitions_behavior = 'OVERWRITE';
INSERT INTO hive.sales.fact_sales
SELECT * FROM staging.sales.daily
WHERE ds = DATE '2026-02-23';
SELECT 결과에 들어 있는 파티션만 교체된다. 다른 날짜 파티션은 그대로 남는다. 즉 "테이블 전체 덮어쓰기" 가 아니라 "이번에 쓰는 파티션만 교체" 다. 전체를 갈아엎으려면 모든 파티션이 결과에 포함되도록 써야 한다.
비파티션 테이블은 위 설정이 적용되지 않는다. 새 테이블을 만들어 바꿔 끼우는 편이 안전하고 빠르다.
CREATE TABLE hive.sales.fact_sales_new AS
SELECT * FROM staging.sales.daily;
DROP TABLE hive.sales.fact_sales;
ALTER TABLE hive.sales.fact_sales_new RENAME TO fact_sales;
DROP 과 RENAME 사이에 테이블이 없는 구간이 생기므로 조회 중인 사용자가 있다면 그 시점을 고려한다. 원본 테이블의 프로퍼티(포맷·압축·외부 위치·권한)는 승계되지 않으므로 SHOW CREATE TABLE 로 미리 확인하고 WITH 절에 다시 적어 준다.
DELETE FROM 은 Hive 커넥터에서 제약이 있다. 파티션 전체를 지우는 형태(파티션 컬럼 조건만 쓴 DELETE)는 메타데이터 수준에서 처리되지만, 임의 조건의 행 단위 삭제는 ACID 트랜잭션 테이블에서만 가능하다. 비 ACID 테이블에서 행 단위 삭제를 시도하면 실패한다. 대용량에서는 느리기도 하므로 위의 두 방법을 먼저 검토한다.
테이블이 Iceberg 라면 MERGE · UPDATE · DELETE 가 모두 지원되므로 덮어쓰기를 우회할 필요가 없다. 반복적인 상태 갱신이 필요한 테이블은 Iceberg 로 옮기는 편이 낫다.
MERGE INTO iceberg.sales.fact_sales t
USING staging.sales.daily s
ON t.pk = s.pk
WHEN MATCHED THEN UPDATE SET amount = s.amount, updttm = s.updttm
WHEN NOT MATCHED THEN INSERT (pk, amount, updttm) VALUES (s.pk, s.amount, s.updttm);
Trino 커넥터 · Trino 카탈로그·스키마와 CTAS