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

Production 용 포맷 고르기

~10 min · format, decision-framework

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

실제로 쓰는 결정 트리

등장인물은 앞에서 다 만났어. 이제 내가 실제로 쓰는 결정 트리를 줄게 — 위에서부터 순서대로 대 보면 돼:

  1. Downstream 파이프라인이 읽어? → Parquet (partitioned, zstd). 여기서 답의 90% 가 끝나.
  2. 데이터가 이미 DB 안에 살아? → 파일로 꺼내지 마. Warehouse 안에서 SQL/dbt 로 계산해.
  3. 받는 사람이 Excel 사용자야? → 경계에서만 CSV, sidecar schema 와 함께. 파이프라인 stage 로는 만들지 말고.
  4. Nested/log 모양 데이터야? → newline-delimited JSON (NDJSON / JSONL). gzip 또는 zstd 로 압축.
  5. Notebook 단계 사이 단기 scratch? → Arrow IPC (Feather). 로드가 제일 빠른 건 Parquet 의 디코딩 단계를 건너뛰기 때문이지, 압축을 건너뛰기 때문이 아냐. Pandas 의 df.to_feather() 로 가면 돼. 이쪽은 여전히 LZ4 frame 이 기본이라 (어떤 40만 행 프레임에선 6.5MB 대 15.2MB 였어 — 비율은 본인 컬럼마다 달라) compression='uncompressed' 를 쓸 일이 거의 없어. 대신 raw PyArrow 로 내려갈 거면 Track 3 의 Arrow 레슨부터 읽어 — 그 경로는 기본값이 반대야.
  6. 작은 데이터인데 diff 로 보고 싶어? → version control 안의 CSV. ~10MB 넘어가면 Parquet 으로 갈아타.

HDF5, Avro, ORC, Iceberg, Delta Lake, Hudi 는?

빠르게 훑자:

  • HDF5 — 과학 데이터, 계층 구조, modern stack 이전 세대. 물리학과 유전체학엔 아직 살아 있어. 새 분석 작업엔 고르지 마.
  • Avro — row-oriented, Kafka 파이프라인의 단골. 스트림엔 괜찮아. At-rest 분석은 여전히 Parquet 이고.
  • ORC — Hadoop 시대의 columnar 경쟁자. 이미 ORC 세상에 살고 있는 게 아니라면 Parquet 을 골라.
  • Iceberg / Delta Lake / Hudi — Parquet 위에 얹는 테이블 포맷. ACID 트랜잭션, schema evolution, time travel 을 더해 줘. Warehouse 급 lakehouse 엔 꼭 필요하고, 머신 한 대짜리 파이프라인엔 과해. 파일 트리로 버티는 단계를 넘어서면 그때 배워.

Code

목적별 올바른 포맷 고르는 파이프라인 친화 write helper·python
from pathlib import Path
import pandas as pd

def write(df: pd.DataFrame, path: Path, *, purpose: str) -> Path:
    '''데이터가 뭐 위한 건지로 포맷 결정.'''
    if purpose == 'pipeline':
        # default 분석 포맷
        path = path.with_suffix('.parquet')
        df.to_parquet(path, index=False, compression='zstd')
    elif purpose == 'human':
        # Excel/CSV boundary — 사람이 본다
        path = path.with_suffix('.csv')
        df.to_csv(path, index=False, encoding='utf-8', lineterminator='\n')
    elif purpose == 'scratch':
        # Notebook scratch — 로드 제일 빠름. Pandas wrapper 는 LZ4 가 기본,
        # raw pyarrow.ipc 는 아님 (Arrow 레슨 참고)
        path = path.with_suffix('.feather')
        df.to_feather(path)
    elif purpose == 'log':
        # Append-only newline-delimited JSON
        path = path.with_suffix('.jsonl')
        df.to_json(path, orient='records', lines=True)
    else:
        raise ValueError(f'unknown purpose {purpose!r}')
    return path

External links

Exercise

본인 팀이 오늘 만들어 내는 데이터를 살펴봐. 출력마다 목적 (pipeline, human, scratch, log) 과 현재 포맷을 분류해. 어긋난 것 하나를 찾아 메모해 — 어딘가에서 CSV 가 파이프라인 stage 노릇을 하고 있거나, Excel 밖에 못 여는 사람한테 Parquet 이 날아가고 있을 거야 — 그리고 맞는 포맷으로 바꾸는 안을 적어.

Progress

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

댓글 0

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

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