본문 바로가기
C.W.K.
Stream
Lesson 03 of 06 · published

Parquet — Columnar Binary, 왜 중요해

~13 min · parquet, columnar, format

Level 0구경꾼
0 XP0/47 lessons0/11 achievements
0/120 XP to next level120 XP to go0% complete

Default 가 돼야 할 포맷

Apache Parquet 은 Hadoop 에서 태어난 columnar binary 파일 포맷인데, 이젠 분석 세계 어디에나 있어. 컬럼마다 데이터를 따로 압축한 청크로 담고, 풍부한 통계 (min/max/null-count) 를 함께 저장하고, footer 덕분에 reader 가 filter predicate 만 보고 row group 을 통째로 건너뛸 수 있어. 결과: 100GB 파일에서 몇 컬럼만 읽는 query 는 필요한 byte 만 만지고, 압축 해제 비용도 딱 그만큼만 내.

CSV 대비 공짜로 받는 것

  • Type. Schema 가 파일의 일부야. amount_usddouble, order_datetimestamp[us] — 읽을 때 추측이 없어.
  • 압축. Snappy 가 default 고, zstd 는 비슷한 속도에 비율이 보통 2–3× 좋아. 10GB CSV 가 1–2GB Parquet 이 되는 일이 흔해.
  • Column pruning. 50컬럼 파일에서 order_dateamount_usd 만 읽으면 나머지 48개는 건드리지도 않아.
  • Predicate pushdown. WHERE country = 'KR' 이면 row-group 통계만 보고 'KR' 이 있을 수 없는 그룹을 통째로 넘겨.
  • Splittable. Reader 여럿이 서로 다른 row group 을 병렬로 처리할 수 있어.

Partitioning — 그 다음 수

Parquet writer 는 논리적 "테이블" 하나를 orders/year=2026/month=4/data.parquet 같은 디렉토리 트리로 쪼갤 수 있어. Reader 는 파일을 열기도 전에 partition 째로 걸러내. 여기에 column pruning 과 predicate pushdown 을 얹으면, 머신 한 대의 DuckDB 로 수백 GB 에 sub-second query 가 나와.

Code

Partitioned Parquet 쓰기 — production default 패턴·python
import pandas as pd

df = pd.read_csv('orders.csv', dtype=str)
df['order_date'] = pd.to_datetime(df['order_date'])
df['amount_usd'] = pd.to_numeric(df['amount_usd'])
df['year']  = df['order_date'].dt.year.astype('Int16')
df['month'] = df['order_date'].dt.month.astype('Int8')

df.to_parquet(
    'warehouse/orders',           # 단일 파일 아니라 디렉토리
    partition_cols=['year', 'month'],
    compression='zstd',
    index=False,
)
# 결과: warehouse/orders/year=2026/month=4/<uuid>.parquet
Column pruning + partition filter 로 읽기·python
import pandas as pd

# Pandas + PyArrow 가 partition layout 자동 발견
df_apr = pd.read_parquet(
    'warehouse/orders',
    columns=['order_date', 'amount_usd', 'country'],   # 이 column 들만 읽음
    filters=[('year', '=', 2026), ('month', '=', 4)],   # 이 partition 만 scan
)
print(f'rows: {len(df_apr):,}')

External links

Exercise

최소 100MB 짜리 CSV 를 골라. df.to_parquet(..., compression='zstd') 로 Parquet 으로 바꾸고, ls -lh 로 disk 크기를 비교해. 그다음 같은 데이터에 대해 pd.read_csvpd.read_parquet 의 시간을 재 봐. 그 배율이 — 모든 분석 팀이 Parquet 으로 표준을 정한 이유야.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.