Apache Hive는 Hadoop 기반의 데이터 웨어하우스 시스템으로, 대규모 데이터 분석과 MapReduce 작업에 널리 활용됩니다. 파티셔닝(Partitioning)은 방대한 데이터셋을 작은 단위로 나누어 쿼리 속도를 크게 향상시키는 핵심 최적화 기법입니다. 이 중 동적 파티셔닝(Dynamic Partitioning)은 데이터를 적재하는 순간 파티션 값을 자동으로 결정해 주는 방식으로, 값을 일일이 직접 지정해야 하는 정적 파티셔닝(Static Partitioning)과 확연히 차별화됩니다.
정적 파티셔닝 vs 동적 파티셔닝 비교
| 구분 | 정적 파티셔닝 | 동적 파티셔닝 |
|---|---|---|
| 파티션 값 | 삽입 시마다 수동 지정 | 데이터로부터 자동 도출 |
| 적합한 경우 | 파티션 수가 적고 명확할 때 | 파티션이 많거나 불확실할 때 |
| WHERE 절 | 필수 | 불필요 |
| 유연성 | 낮음 | 높음 |
동적 파티셔닝 활성화하기
Hive에서 동적 파티셔닝을 사용하려면 아래와 같은 설정을 먼저 활성화해야 합니다.
SET hive.exec.dynamic.partition = true; SET hive.exec.dynamic.partition.mode = nonstrict;
nonstrict 모드에서는 모든 파티션 컬럼을 동적으로 처리할 수 있으며, 기본값인 strict 모드에서는 최소 하나의 정적 파티션 컬럼을 반드시 지정해야 합니다.
전체 실습 예제
원본 테이블을 생성하고 데이터를 적재한 뒤, 동적 파티셔닝으로 데이터를 분산 저장하는 전체 과정입니다.
-- 1단계: 원본 테이블 생성 CREATE TABLE sales_raw ( id INT, product STRING, amount DOUBLE, sale_date STRING, country STRING ) ROW FORMAT DELIMITED FIELDS TERMINATED BY ','; -- 2단계: 데이터 적재 LOAD DATA LOCAL INPATH '/home/data/sales.csv' INTO TABLE sales_raw; -- 3단계: 파티션 테이블 생성 CREATE TABLE sales_partitioned ( id INT, product STRING, amount DOUBLE, sale_date STRING ) PARTITIONED BY (country STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY ','; -- 4단계: 동적 파티셔닝으로 데이터 삽입 INSERT INTO TABLE sales_partitioned PARTITION (country) SELECT id, product, amount, sale_date, country FROM sales_raw;
위 쿼리를 실행하면 Hive가 원본 데이터의 country 값을 자동으로 식별하여, 고유한 값마다 파티션 디렉터리를 생성합니다.
파티션 관리하기
-- 파티션 목록 조회 SHOW PARTITIONS sales_partitioned; -- 특정 파티션만 조회 (파티션 프루닝) SELECT * FROM sales_partitioned WHERE country = 'India'; -- 파티션 삭제 ALTER TABLE sales_partitioned DROP PARTITION (country = 'India');
파티션 조건을 걸어 쿼리하면 파티션 프루닝(partition pruning)이 적용되어 해당 파티션만 스캔합니다. 덕분에 전체 테이블을 읽는 것보다 훨씬 빠른 성능을 얻을 수 있습니다.
마무리
Hive의 동적 파티셔닝은 INSERT 과정에서 데이터 값을 기준으로 파티션을 자동 생성해 주는 강력한 기능입니다. 파티션 값을 하나하나 지정할 필요가 없어 수작업이 크게 줄어들고, 파티션 프루닝을 통한 쿼리 성능 향상 효과도 함께 누릴 수 있습니다. 특히 고유한 파티션 값이 많은 대규모 데이터셋을 다룰 때 가장 빛을 발합니다.
