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 파일 포맷, 이젠 분석 세계 어디나 있어. 각 column 데이터를 별도 압축 청크로, 풍부한 통계 (min/max/null-count) 와 함께, footer 가 reader 에게 filter predicate 로 전체 row group skip 하게 함. 결과: 100GB 파일에서 몇 column 만 읽는 query 가 필요한 byte 만 만지고 압축-인지 비용 지불.

CSV 대비 공짜로 받는 것

  • Type. Schema 가 파일 일부. amount_usddouble, order_datetimestamp[us] — 읽을 때 추측 없음.
  • 압축. Snappy 가 default; zstd 가 보통 비슷한 속도에 2–3× 좋은 비율. 10GB CSV 가 1–2GB Parquet 자주 됨.
  • Column pruning. 50-column 파일에서 order_dateamount_usd 만 읽으면 나머지 48 skip.
  • Predicate pushdown. WHERE country = 'KR' 가 row-group 통계로 country'KR' 안 가졌던 row group 전체 skip.
  • Splittable. 여러 reader 가 다른 row group 을 병렬 처리.

Partitioning — 다음 레벨

Parquet writer 가 논리적 "테이블" 을 orders/year=2026/month=04/data.parquet 같은 디렉토리 트리로 split 가능. Reader 가 파일 열기 전에 전체 partition prune. 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=04/<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_csv vs pd.read_parquet 시간 측정. 비율이 모든 분석 팀이 Parquet 표준화한 이유야.

Progress

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

댓글 0

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

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