본문으로 바로가기
리옵트 핸드북
리옵트 핸드북
DuckDB 고급 활용

시작과 기준선

포지셔닝과 적합한 워크로드버전·설치·런타임 기준연결·스토리지 모델실행 가능한 예제 번들

파일·레이크 분석

CSV·JSON 수집Parquet 레이크 모델링다중 파일·스키마 진화파티션 쓰기와 오브젝트 스토리지Lakehouse 포맷

분석 SQL·연동

Friendly SQL과 매크로시계열·분석 SQL중첩·반정형 데이터Python·Arrow·Polars·BIdbt·MotherDuck·Ibis 생태계Materialization·Index·통계

성능·운영

성능 프로파일링벤치마크·프로파일링 실습메모리·spill·실패 모드동시성·보안·운영보안 Hardening 체크리스트

부록

템플릿참고 자료검증 리포트업데이트 내역
핸드북›DuckDB 고급 활용›Python·Arrow·Polars·BI

Python·Arrow·Polars·BI

Python API, Arrow zero-copy, Pandas/Polars replacement scan, BI 연결을 실무 분석 흐름으로 정리합니다.

핵심 요약

  • DuckDB는 SQL과 Python 생태계를 한 프로세스에서 연결해 Pandas·Polars·Arrow 객체를 table처럼 질의하고 결과를 DataFrame/Arrow로 돌려받습니다.
  • module-level duckdb.sql()은 전역 in-memory connection을 쓰므로 운영 notebook·batch에서는 명시 connection을 권장합니다.
  • replacement scan은 Python 변수명을 SQL에서 그대로 참조하되 read-only이며, DataFrame에 INSERT/UPDATE를 하는 게 아니라 scan만 합니다.
  • Arrow Dataset은 projection/filter pushdown이 가능하고 to_arrow_table()로 반환하면 Pandas 변환 비용을 늦추고 Arrow-native 도구와 연결하기 쉽습니다.
  • 팀 표준이 SQL이면 DuckDB를 중심에 두고 expression 중심 feature engineering은 Polars를 함께 쓰며, BI는 read-only .duckdb/curated Parquet와 batch refresh로 고정합니다.

DuckDB가 생산성에서 가장 빛나는 지점은 SQL과 Python 분석 생태계를 한 프로세스 안에서 연결한다는 점입니다. Pandas, Polars, Arrow 객체를 table처럼 질의하고, 결과는 다시 DataFrame이나 Arrow Table로 돌려받습니다.

Python 기본 패턴

import duckdb

con = duckdb.connect("analytics.duckdb")
con.execute("SET threads = 4")
con.execute("SET memory_limit = '8GB'")

df = con.execute("""
    SELECT customer_id, sum(amount) AS revenue
    FROM read_parquet('curated/orders/*.parquet')
    GROUP BY customer_id
""").df()

module-level duckdb.sql()은 전역 in-memory connection을 사용합니다. notebook 초반 탐색에는 편하지만, 운영 notebook이나 batch에서는 명시 connection을 권장합니다.

Replacement scan

Pandas DataFrame, Polars DataFrame, Arrow Table은 Python 변수명 그대로 SQL에서 참조할 수 있습니다.

import duckdb
import pandas as pd

customers = pd.DataFrame({"customer_id": ["c1", "c2"], "segment": ["team", "pro"]})

duckdb.sql("""
    SELECT segment, count(*) AS customers
    FROM customers
    GROUP BY ALL
""").df()

이 방식은 read-only입니다. DataFrame에 INSERT/UPDATE를 하는 게 아니라, DuckDB가 해당 객체를 scan하는 것뿐입니다.

Arrow Dataset

Arrow Dataset은 directory of Parquet files를 가리키고, DuckDB는 projection/filter를 pushdown할 수 있습니다.

import duckdb
import pyarrow.dataset as ds

dataset = ds.dataset("curated/orders", format="parquet")

result = duckdb.connect().execute("""
    SELECT order_date, sum(amount) AS revenue
    FROM dataset
    WHERE order_date >= DATE '2026-01-01'
    GROUP BY ALL
""").to_arrow_table()

Arrow로 반환하면 Pandas 변환 비용을 늦출 수 있고 다른 Arrow-native 도구와 연결하기 쉽습니다.

Polars와 역할 분담

작업DuckDBPolars
SQL 기반 join/aggregate강함가능
lazy dataframe pipeline가능하지만 주력 아님강함
Parquet lake 탐색강함강함
BI/SQL 공유강함약함
Python expression 변환약함강함

팀 표준이 SQL이면 DuckDB를 중심에 두고 Python expression이 많은 feature engineering은 Polars를 함께 씁니다.

BI 연결

DuckDB는 ODBC/JDBC와 여러 third-party BI 도구에서 사용할 수 있습니다. BI 운영에서는 다음을 고정합니다.

항목기준
데이터 파일read-only .duckdb 또는 curated Parquet
refreshbatch publish 이후 BI refresh
권한OS/cloud storage 권한으로 제한
쿼리BI 사용자가 임의 extension/network access를 열지 못하게 격리

참고 자료

  • Python API
  • SQL on Pandas
  • SQL on Apache Arrow
  • Integration with Polars
  • ODBC Overview

관련 문서

검증 리포트

DuckDB 고급 활용 핸드북의 구조·링크·공식 근거·버전 기준 검증 결과

참고 자료

DuckDB 고급 활용 핸드북의 공식 문서·릴리스 근거 모음

하네스의 5요소

하네스 엔지니어링 · 좋은 하네스를 구성하는 환경, 역할, 기준, 루프, 정리의 다섯 축을 설명합니다.

Ch7. exec/자동화

Codex 고급 활용 · codex exec의 JSONL 스트림(--json)·스키마 강제(--output-schema)·resume, GitHub Action과 CODEX_API_KEY 스코프, app-server 스트리밍 실행과 hooks 엔진으로 CI를 자동화하는 패턴

중첩·반정형 데이터

JSON, STRUCT, LIST, VARIANT를 분석 가능한 스키마로 바꾸는 DuckDB 모델링 기준을 정리합니다.

dbt·MotherDuck·Ibis 생태계

dbt-duckdb, MotherDuck, Ibis를 DuckDB 기반 분석 운영에 편입하는 기준과 한계를 정리합니다.

On this page

Python 기본 패턴Replacement scanArrow DatasetPolars와 역할 분담BI 연결참고 자료