← 목록으로
단계 10

DuckDB · Polars — 가볍게 확인하기

클러스터 없이 노트북에서 수 GB를 처리하는 도구. Spark 결과를 빠르게 검증하고, 로컬/S3 Parquet을 SQL로 바로 조회.

언제 무엇을 쓰나

데이터 크기도구
~ 수백 MBPandas
수백 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")

같은 질문, 같은 답, 다른 규모. 개념(선택·필터·집계·조인)은 하나라는 걸 확인하세요.

연습 과제

  1. 12~13주차에 Spark로 만든 Parquet을 DuckDB로 읽어 결과가 같은지 확인
  2. 1GB 정도 CSV로 Pandas / Polars / DuckDB / Spark(local) 처리 시간 비교표 만들기