← 목록으로
단계 10
DuckDB · Polars — 가볍게 확인하기
클러스터 없이 노트북에서 수 GB를 처리하는 도구. Spark 결과를 빠르게 검증하고, 로컬/S3 Parquet을 SQL로 바로 조회.
언제 무엇을 쓰나
| 데이터 크기 | 도구 |
|---|---|
| ~ 수백 MB | Pandas |
| 수백 MB ~ 수십 GB (한 대) | DuckDB / Polars |
| 수십 GB ~ TB 이상 (여러 대) | Spark |
"빅데이터"라고 무조건 Spark를 쓰는 게 아닙니다. 한 대에서 되면 한 대에서 하는 게 훨씬 빠르고 간단합니다.
DuckDB — 파일을 SQL로
pip install duckdb
import duckdb
# Parquet/CSV를 테이블처럼 바로 쿼리 (로드 불필요)
duckdb.sql("SELECT region, SUM(amount) FROM 'sales.parquet' GROUP BY region").show()
# 여러 파일 / 파티션 디렉터리
duckdb.sql("SELECT COUNT(*) FROM 'out/sales/**/*.parquet'")
# Pandas와 자유롭게 오감
import pandas as pd
df = pd.read_csv("sales.csv")
duckdb.sql("SELECT * FROM df WHERE amount > 100").df()
S3에서 바로 읽기
con = duckdb.connect()
con.sql("INSTALL httpfs; LOAD httpfs;")
con.sql("SET s3_endpoint='localhost:9000'; SET s3_use_ssl=false; SET s3_url_style='path';")
con.sql("SET s3_access_key_id='minio'; SET s3_secret_access_key='minio123';")
con.sql("SELECT region, SUM(amount) FROM 's3://lake/cleaned/sales/*.parquet' GROUP BY region").show()
Spark로 S3에 쓴 결과를 DuckDB로 즉시 검증하는 패턴이 실무에서 아주 유용합니다.
Polars — 빠른 DataFrame
pip install polars
import polars as pl
df = pl.read_parquet("sales.parquet")
(df.filter(pl.col("amount") > 100)
.group_by("region")
.agg(pl.sum("amount").alias("total"), pl.len().alias("n"))
.sort("total", descending=True))
# 지연 실행 (Spark처럼 계획 후 최적화)
lazy = pl.scan_parquet("big/*.parquet").filter(pl.col("amount") > 0).group_by("region").agg(pl.sum("amount"))
lazy.collect()
Pandas와 API가 비슷하지만 멀티코어·지연 실행·메모리 효율이 뛰어나 대체제로 자리 잡는 중.
세 도구로 같은 질문 답하기
# Pandas
pd.read_parquet("s.parquet").groupby("region")["amount"].sum()
# Polars
pl.read_parquet("s.parquet").group_by("region").agg(pl.sum("amount"))
# DuckDB
duckdb.sql("SELECT region, SUM(amount) FROM 's.parquet' GROUP BY region")
# Spark
spark.read.parquet("s.parquet").groupBy("region").sum("amount")
같은 질문, 같은 답, 다른 규모. 개념(선택·필터·집계·조인)은 하나라는 걸 확인하세요.
연습 과제
- 12~13주차에 Spark로 만든 Parquet을 DuckDB로 읽어 결과가 같은지 확인
- 1GB 정도 CSV로 Pandas / Polars / DuckDB / Spark(local) 처리 시간 비교표 만들기