개요
2024.01.17 - [Hive] 데이터베이스, 2024.01.18 - [Hive] 테이블 - 개념 및 유형에 이어서 이번 글에서는 Hive 테이블의 파티션 개념에 대해 정리한다.
파티션
Hive는 디렉터리 단위로 데이터를 읽기 때문에 데이터가 많아질수록 속도가 느려진다. 이를 방지하기 위해 데이터를 하위 폴더로 분리해서 저장하는 파티션 개념을 사용한다.
테이블 생성 시 PARTITIOND BY절로 기준 컬럼 정보를 제공하면 디렉터리 단위로 데이터가 생성되며, 데이터 조회 시 WHERE 조건절에서 사용할 수 있다. 즉, SELECT 시 읽는 데이터의 양을 줄여서 처리 속도를 개선할 수 있다.
사용 예시)
-- 날짜 기준 파티션 생성
CREATE TABLE tbl(
col1 STRING
) PARTITIONED BY (yymmdd STRING);
-- 데이터 저장 구조
hdfs://tbl/yymmdd=20180501/0000_0
hdfs://tbl/yymmdd=20180502/0000_0
hdfs://tbl/yymmdd=20180503/0000_0
-- 조회
SELECT yymmdd, count(1)
FROM tbl
WHERE yymmdd between '20180501' and '20180503'
GROUP BY yymmdd
파티션은 고정 파티션, 동적 파티션 두 가지 종류가 존재한다.
고정 파티션
INSERT문으로 테이블에 데이터를 입력하는 시점에 파티션 정보를 고정된 값으로 전달한다.
INSERT INTO TABLE tbl(yymmdd='20231010')
SELECT name
FROM temp;
위와 같이 tbl 테이블에 yymmdd 파티션에 20231010 값을 직접 전달하면 아래와 같은 구조로 데이터가 생성된다.
hdfs://[tbl 테이블 LOCATION]/yymmdd=20180510/
동적 파티션
INSERT문으로 테이블에 데이터를 입력하는 시점에 파티션 정보를 조회하는 컬럼을 전달한다.
INSERT INTO TABLE tbl(yymmdd)
SELECT name,
yymmdd
FROM temp;
동적 파티션은 사용 시 속도가 느려진다는 단점이 있어 생성 개수에 제한이 있다. 관련 설정 및 기본값은 아래와 같다.
-- 동적 파티션 개수
hive.exec.max.dynamic.partitions=1000;
-- 노드별 동적 파티션 생성 개수
hive.exec.max.dynamic.partitions.pernode=100;
만약 파티션 컬럼에 NULL이 있는 경우, 기본 파티션 이름을 이용해 데이터를 생성한다.
-- 기본 파티션 명
hive.exec.default.partition.name=__HIVE_DEFAULT_PARTITION__
-- 파티션 구조
hdfs://temp/yymmdd=20180510/hh=00/
hdfs://temp/yymmdd=20180510/hh=__HIVE_DEFAULT_PARTITION__/
-- 조회 예시
SELECT *
FROM temp
WHERE hh = '__HIVE_DEFAULT_PARTITION__';
참고 문서
https://cwiki.apache.org/confluence/display/Hive/Configuration+Properties