C.W.K.
Stream
Lesson 05 of 06 · published

DuckDB — DB 서버 없이 파일에 SQL

~12 min · duckdb, sql, olap

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

분석용 SQLite

DuckDB 는 in-process OLAP SQL 데이터베이스. 핵심: pip install duckdb 하고 SQL 쓰면 Parquet 파일, Arrow 테이블, Pandas DataFrame, Polars DataFrame, CSV 를 직접 query — 복사 없이, 서버에 로드 없이. 현 stable: 1.5.2.

SQLite 가 트랜잭션 row-oriented 워크로드용 in-process DB 라면 DuckDB 는 분석 column-oriented 워크로드용 in-process DB. 같은 아이디어 — 서버 없음, Python 프로세스 안에서 — 다른 최적화 타겟.

잘하는 거

  • Parquet 파일을 column pruning + predicate pushdown 자동으로 query.
  • 여러 Parquet 파일을 테이블처럼 join.
  • Pandas/Polars DataFrame 을 SQL 이 더 자연스러운 transformation 표현일 때 SQL 로 query.
  • 중간 크기 데이터 (수백 GB) 분석 "warehouse" 역할 — Snowflake 띄우는 게 overkill 일 때.

아닌 것

DuckDB 는 고동시성 OLTP 용 아님 (Postgres 써). 분산 아님 (수십 노드 페타바이트엔 BigQuery/Snowflake/Spark). 그리고 read-heavy 분석 최적화라 row 한 번에 하나씩 안 써 — batch insert.

Code

세 패턴: 파일 query, DataFrame query, DB 파일에 persist·python
import duckdb
import pandas as pd

# 1. Parquet 직접 query — DataFrame 메모리에 안 로드
result = duckdb.sql('''
    SELECT date_trunc('month', order_date) AS month,
           SUM(amount_usd) AS revenue
    FROM 'warehouse/orders/year=2026/month=*/*.parquet'
    GROUP BY 1 ORDER BY 1
''').to_df()

# 2. Pandas DataFrame 을 테이블처럼 query
df = pd.read_parquet('customers.parquet')
by_country = duckdb.sql('''
    SELECT country, COUNT(*) AS n FROM df GROUP BY 1 ORDER BY n DESC
''').to_df()

# 3. DuckDB 파일에 persist — 분석용 SQLite 처럼
con = duckdb.connect('analytics.duckdb')
con.sql('''
    CREATE OR REPLACE TABLE monthly_revenue AS
    SELECT date_trunc('month', order_date) AS month,
           SUM(amount_usd) AS revenue
    FROM 'warehouse/orders/year=2026/month=*/*.parquet'
    GROUP BY 1
''')
con.close()

External links

Exercise

100MB+ Parquet 파일 (또는 partitioned Parquet 디렉토리) 골라. 같은 monthly-revenue (또는 동등) query 를 세 가지로 작성: pd.read_parquet + groupby, pl.scan_parquet + group_by, duckdb.sql(...). 각 시간 측정. DuckDB 가 보통 이기고 SQL 이 가장 읽기 쉬운 거 알아채.

Progress

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

댓글 0

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

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