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

Pandas vs Polars vs DuckDB vs SQL — 언제 뭘 쓸까

~13 min · foundation, tools, decision-framework

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

초보자가 제일 많이 하는 실수는 제일 유명한 도구 하나를 골라서 모든 문제를 거기 욱여넣는 거야. 프로가 제일 먼저 익히는 기술은 눈앞의 일 모양에 맞는 도구를 고르는 거고. 실제로 굴러가는 판단 기준을 줄게.

상황골라이유
탐색, <100M 행, 지저분한 mixed typePandas최대 ecosystem, 모든 분석 라이브러리가 받아 줌, REPL 친화적.
같은 모양인데 노트북에서 100M10BPolars (lazy)Streaming 엔진, query optimizer, 병렬 실행. Pandas 는 OOM.
Parquet/Arrow 위에서 익숙한 SQL 분석DuckDBIn-process, 서버 없음, 파일 직접 query, 비용 대비 환상적인 성능.
데이터가 이미 Postgres/BigQuery/Snowflake 안에SQL (warehouse 안)꺼내고 다시 넣지 말고. 데이터가 사는 곳에서 계산해. 정리는 dbt 로.
Label 필요 없는 수치 위주 작업NumPyPandas 보다 overhead 적음, vectorization 직행.
진짜 페타바이트 규모Spark / BigQuery / Snowflake이 quest 범위 밖. 원리는 그대로 옮겨가.

묻기 전에 주는 기본값

2026 에 맨바닥에서 시작하고 데이터가 파일로 있다면: Parquet 으로 저장하고, DuckDB 로 query 하고, 크기에 따라 Pandas 나 Polars 로 주무르고, Pandera 로 검증해. 이 조합이 대부분의 실무자를, 대부분의 문제에서, 한 머신으로, 더 무거운 게 필요해질 때까지 몇 년을 버티게 해 줘.

요점은 표를 외우는 게 아니야. import 를 치기 전에 이 일의 모양이 뭐지? 하고 먼저 묻는 습관을 들이는 거야.

Code

같은 일, 도구 넷 — 상황에 맞는 걸로·python
# 목표: 5GB Parquet 파일에서 월별 매출. 4가지 정당한 방법:

# 1. Pandas — 메모리에 들어감, Pandas 알면 가장 쉬움
import pandas as pd
df = pd.read_parquet('orders.parquet', columns=['order_date', 'amount_usd'])
pandas_result = (df.assign(month=lambda d: d['order_date'].dt.to_period('M'))
                   .groupby('month', as_index=False)['amount_usd'].sum())

# 2. Polars (lazy) — stream, 전체 파일 안 로드
import polars as pl
polars_result = (pl.scan_parquet('orders.parquet')
                   .group_by(pl.col('order_date').dt.truncate('1mo').alias('month'))
                   .agg(pl.col('amount_usd').sum())
                   .sort('month')
                   .collect())

# 3. DuckDB — 파일에 SQL 직격, DataFrame 안 로드
import duckdb
duck_result = duckdb.sql('''
    SELECT date_trunc('month', order_date) AS month,
           SUM(amount_usd) AS revenue
    FROM 'orders.parquet'
    GROUP BY 1 ORDER BY 1
''').to_df()

# 4. 진짜 warehouse 안의 pure SQL — 데이터 사는 곳에 두고
warehouse_sql = '''
    SELECT date_trunc('month', order_date) AS month, SUM(amount_usd) AS revenue
    FROM analytics.orders
    GROUP BY 1 ORDER BY 1
'''  # warehouse 클라이언트로 실행, 파일 소유는 dbt 가.

External links

Exercise

본인이 해 본 프로젝트 하나 (학교, 일, 사이드) 골라서, 오늘 다시 한다면 이 네 가지 (Pandas / Polars / DuckDB / SQL-in-warehouse) 중 어느 것으로 할지, 그리고 인지 한 단락으로 적어 봐. 목표는 정답 맞히기가 아니라 고르는 습관 자체야.

Progress

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

댓글 0

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

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