Hive 파티셔닝
Hive 파티셔닝 (Hive Partitioning)
Hive 파티셔닝은 테이블을 파티션 키(partition key) 기준으로 여러 파일로 쪼개는 파티셔닝 전략이에요. 파일들은 폴더 단위로 정리되고, 각 폴더 안에서 파티션 키는 폴더 이름에 의해 결정되는 값을 가져요.
출처: 공식문서
읽기
Hive 파티셔닝된 데이터셋에서 데이터를 읽으려면:
SELECT *
FROM read_parquet('orders/*/*/*.parquet', hive_partitioning = true);
쓰기
테이블을 Hive 파티셔닝된 데이터셋으로 쓰려면:
COPY orders
TO 'orders' (FORMAT parquet, PARTITION_BY (year, month));
주의: PARTITION_BY 옵션에는 표현식(expression)을 쓸 수 없어요. 그 대신 아래 문법처럼 컬럼을 즉석에서 만들어낼 수 있어요:
COPY (SELECT *, year(timestamp) AS year, month(timestamp) AS month FROM services)
TO 'test' (PARTITION_BY (year, month));
파티션 컬럼 포함 여부
읽을 때 파티션 컬럼은 디렉터리 구조에서 얻어지고, hive_partitioning 파라미터에 따라 포함하거나 제외할 수 있어요.
FROM read_parquet('test/*/*/*.parquet', hive_partitioning = false); -- year, month 컬럼은 포함되지 않음
FROM read_parquet('test/*/*/*.parquet', hive_partitioning = true); -- year, month 파티션 컬럼이 포함됨
아래는 Hive 파티셔닝된 파일 계층 예시예요. 파일이 year와 month 두 개의 키로 파티셔닝되어 있어요.
orders
├── year=2021
│ ├── month=1
│ │ ├── file1.parquet
│ │ └── file2.parquet
│ └── month=2
│ └── file3.parquet
└── year=2022
├── month=11
│ ├── file4.parquet
│ └── file5.parquet
└── month=12
└── file6.parquet
이 계층에 저장된 파일들은 hive_partitioning 플래그로 읽을 수 있어요.
SELECT *
FROM read_parquet('orders/*/*/*.parquet', hive_partitioning = true);
hive_partitioning 플래그를 지정하면 컬럼 값이 디렉터리에서 읽혀요.
파티션 키 필터 프루닝
파티션 키에 대한 필터는 자동으로 파일 안으로 푸시다운(push down)돼요. 이 덕분에 시스템이 쿼리를 만족시키는 데 필요 없는 파일 읽기를 건너뛰어요. 예를 들어 위 데이터셋에 대해 다음 쿼리를 실행한다고 해볼게요:
SELECT *
FROM read_parquet('orders/*/*/*.parquet', hive_partitioning = true)
WHERE year = 2022
AND month = 11;
이 쿼리를 실행하면 다음 파일만 읽혀요:
orders
└── year=2022
└── month=11
├── file4.parquet
└── file5.parquet
자동 감지
기본적으로 시스템은 제공된 파일이 hive 파티셔닝 계층 구조인지 추론하려고 해요. 그렇다면 hive_partitioning 플래그가 자동으로 켜져요. 자동 감지는 폴더 이름을 살펴보고 'key' = 'value' 패턴을 찾아요. 이 동작은 hive_partitioning 설정 옵션으로 덮어쓸 수 있어요:
SET hive_partitioning = false;
hive_types
hive_types는 hive 파티션의 논리 타입을 struct로 지정하는 방법이에요:
SELECT *
FROM read_parquet(
'dir/**/*.parquet',
hive_partitioning = true,
hive_types = {'release': DATE, 'orders': BIGINT}
);
hive_types는 DATE, TIMESTAMP, BIGINT 타입에 대해 자동 감지돼요. 자동 감지를 끄려면 hive_types_autocast = 0 플래그를 설정하면 돼요.