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 파티셔닝된 파일 계층 예시예요. 파일이 yearmonth 두 개의 키로 파티셔닝되어 있어요.

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_typesDATE, TIMESTAMP, BIGINT 타입에 대해 자동 감지돼요. 자동 감지를 끄려면 hive_types_autocast = 0 플래그를 설정하면 돼요.

더 알아보기 (Learn more)