쓰기 정렬

쓰기 정렬 (Write Ordering)

개요

쓰기 정렬(write ordering)은 테이블 파일 내 **데이터의 물리적 배치(layout)**를 제어하는 기능이에요. 쿼리 실행 중에 데이터를 정렬하는 SORT BY와 달리, 쓰기 정렬은 쓰기 시점에 적용되어 저장된 파일에 그대로 유지됩니다.

쓰기 정렬은 Iceberg 테이블에서 지원되며, 테이블 생성 시 지정할 수 있어요. Hive는 두 가지 쓰기 정렬 전략을 지원합니다.

  • 타입 고유 정렬 (Type-Native Ordering): 하나 이상의 컬럼을 지정된 순서로 정렬
  • Z-정렬 (Z-Ordering): 공간 채움 곡선(space-filling curves)을 사용한 다차원 클러스터링

출처: 문서

본문

타입 고유 컬럼 정렬 (Type-Native Column Ordering)

버전 (Version)

Hive 버전 4.1.0에서 도입되었어요.

구문 (Syntax)

CREATE TABLE table_name (column_definitions)
WRITE [LOCALLY] ORDERED BY column_name [ASC | DESC] [NULLS FIRST | NULLS LAST]
  [, column_name [ASC | DESC] [NULLS FIRST | NULLS LAST] ]*
STORED BY ICEBERG
[STORED AS file_format];

예제 (Examples)

CREATE TABLE events (
  event_id BIGINT,
  event_date DATE,
  event_type STRING
)
WRITE LOCALLY ORDERED BY event_date DESC
STORED BY ICEBERG
STORED AS ORC;
CREATE TABLE orders (
  order_id BIGINT,
  order_date DATE,
  customer_id INT,
  amount DECIMAL(10,2)
)
WRITE ORDERED BY order_date DESC NULLS FIRST, order_id ASC
STORED BY ICEBERG;

Z-정렬 (Z-Ordering)

버전 (Version)

개요 (Overview)

Z-정렬은 여러 컬럼을 동시에 클러스터링해 다차원 범위 조회(multi-dimensional range queries)의 성능을 높이는 기법이에요.

구문 (Syntax)

CREATE TABLE table_name (column_definitions)
WRITE [LOCALLY] ORDERED BY ZORDER(column_name [, column_name ]*)
STORED BY ICEBERG
[STORED AS file_format];

예제 (Example)

CREATE TABLE user_events (
  user_id INT,
  event_date DATE,
  event_type STRING,
  value DOUBLE
)
WRITE LOCALLY ORDERED BY ZORDER(user_id, event_date)
STORED BY ICEBERG
STORED AS ORC;

테이블 프로퍼티 방식 (Table Properties Method)

CREATE TABLE table_name (column_definitions)
STORED BY ICEBERG
TBLPROPERTIES (
  'sort.order' = 'zorder',
  'sort.columns' = 'column1,column2'
);

SORT BY와의 비교 (Comparison with SORT BY)

  • SORT BY는 쿼리 실행 시 각 리듀서(reducer) 내부에서 정렬하지만 파일 레이아웃에는 반영되지 않아요.
  • 쓰기 정렬은 데이터가 파일에 저장되는 순간 정렬되어 물리적으로 유지되므로, 이후 읽기 성능이 개선됩니다.

제한 사항과 고려 사항 (Limitations and Considerations)

  • 쓰기 정렬은 Iceberg 테이블에서만 지원됩니다.
  • 정렬된 데이터를 활용하려면 해당 컬럼에 대한 필터(pruning)가 효과적으로 동작할 수 있는 워크로드에서 유리해요.

더 알아보기 (Learn more)

쓰기 정렬은 Iceberg 테이블의 물리적 데이터 배치를 미리 정렬해 조회 성능을 높이는 고급 기능이에요. 단일 컬럼 정렬은 Type-Native Ordering, 다중 컬럼 범위 조회에는 Z-Ordering을 사용하면 좋습니다.