IT 기술/데이터엔지니어링

DuckDB 란? DuckDB + Postgresql 활용 (Python)

to,min 2025. 3. 10. 15:05

DuckDB 등장 배경 

현대 데이터 분석의 흐름은 "Bigdata is dead" 라는 슬로건과 함께 새로운 국면을 맞이하는 것 같습니다.

대다수의 기업은 소위 "빅데이터" 라는 사이즈의 데이터를 핸들링 하지 않는다고도 합니다.

DuckDB 는 이러한 흐름에 적절한 서비스가 될 수 있다고 생각됩니다.

 

 

DuckDB ?

DuckDB 는 C++ 기반 오픈소스 인메모리 엔진입니다. 

개발하시는 분들은 익숙하게 들어보셨을 SQLite 와 유사합니다. 직접 서버를 구성해서 설치하는 것이 아닌

애플리케이션 내 운용이 됩니다.

 

 

Duck DB 의 장점

1. 오픈소스

2. in-memory & in-progress

- 설치가 간단하고 빠릅니다.

3. SQL 호환

- 기존 SQL 문법으로 핸들링이 가능하여 진입장벽이 낮습니다. 

4. 열 기반 DB 시스템

- 전통적인 행기반 RDBMS 와 달리 열 기반 시스템으로 데이터분석 및 OLAP 에 최적화 되어있습니다.

 

 

Duck DB 의 단점

1. Read-Only로 OLTP 작업의 한계

2. 싱글노드만 지원

->  + 최근 딥시크에서 DuckDB 를 멀티 클러스트 환경에서 사용하게 시도하는 프로젝트도 있다고 합니다.

 

 

 

각설하고 사용 예제를 보면 DuckDB 의 강력함이 느껴질 것 같습니다.

 

예제 시나리오

Postgre 를 메인 DB 로 사용, Python Application 환경에서 DuckDB 로 데이터 핸들링 하는 ETL 

 

1. Postgre 에서 데이터 Extract 

2. DuckDB 에다 1번에서 Extract 한 Dataframe 을 등록 

3. DuckDB 를 이용하여 Transform  

4. DuckDB 를 Postgre 에 연결하여 메인 DB(Postgre) 에 변경 결과 Load 

 

위 흐름 대로 구현한 예제입니다.

애플리케이션 내에서 별개의 DB 시스템의 테이블을 쉽게 핸들링하는 것을  보여주기 위한 구성을 해봤습니다.

 

DuckDB 는 csv, parquet 등 파일 기반 데이터 추출이 강력하고 S3 와 같은 Object storage 와도 호환이 잘 됩니다.

그렇다는 것은  아래 예제에서 Extract 부분을 Postgre 뿐만 아니라 다른 파일에서 데이터를 추출한 데이터도 DuckDB에 등록해서

하나의 쿼리로 분석이 가능하다는 것 입니다.

 

import duckdb
import polars as pl
from sqlalchemy import create_engine

# PostgreSQL 연결 정보
PG_HOST = "your host"   # PostgreSQL 서버 주소
PG_PORT = "your port"        # PostgreSQL 포트
PG_DB = "your db"       # 데이터베이스 이름
PG_SCHEMA = "your schema"       # 데이터베이스 이름
PG_USER = "your user"    # 사용자명
PG_PASSWORD = "your pw" # 비밀번호


# PostgreSQL 연결
PG_CONN_STR = f"dbname={PG_DB} user={PG_USER} password={PG_PASSWORD} host={PG_HOST} port={PG_PORT}"
pg_conn_string = f"postgresql://{PG_USER}:{PG_PASSWORD}@{PG_HOST}:{PG_PORT}/{PG_DB}"
engine = create_engine(pg_conn_string)


# 1️⃣ PostgreSQL에서 `animal` 테이블 조회하여 DataFrame 적재
df = pl.read_database("SELECT * FROM animals", connection=engine)
print(df.head)

# 2️⃣ DuckDB 연결 및 테이블 등록
con = duckdb.connect()
con.register("animal_df", df)  # Polars DataFrame을 DuckDB에 등록
print(con.execute("select * from animal_df").pl())


# 3️⃣ DuckDB 쿼리로 `id ≤ 30`인 name을 'king'으로 변경
update_query = """
CREATE TEMP TABLE temp_animal AS 
SELECT *, 
    CASE WHEN id <= 30 THEN 'king' ELSE name END AS new_name
FROM animal_df;
"""
con.execute(update_query)

# 4️⃣ 업데이트된 데이터 조회
updated_df = con.query("SELECT * FROM temp_animal").pl()
print(updated_df)


# 5️⃣ DuckDB에서 PostgreSQL을 직접 연결하여 DELETE & INSERT
re = con.execute(f"""
    INSTALL postgres;
    LOAD postgres;
    ATTACH '{PG_CONN_STR}' AS pg_db (TYPE postgres);
""").pl()

try:
    con.execute('BEGIN TRANSACTION;').pl()
    # DELETE 기존 데이터
    con.execute(f"""
        DELETE FROM pg_db.{PG_SCHEMA}.animals
        WHERE id IN (SELECT id FROM temp_animal);
    """)
    
    # INSERT 새로운 데이터
    insert_query = f"""
    INSERT INTO pg_db.{PG_SCHEMA}.animals (id, name, age)
    SELECT id, new_name, age FROM temp_animal;
    """
    con.execute(insert_query)
    con.execute('COMMIT').pl()
    print("PostgreSQL DELETE & INSERT 완료")
except Exception as e:
    print(e)
    con.execute('ROLLBACK').pl()
finally:
    # DuckDB 연결 종료
    con.close()

 

 

느낀점

DuckDB Docs 에 " It is designed to be fast, reliable, portable, and easy to use"  라고 되어있습니다.

우선 사용하기 간편하고 쉬웠습니다. 그리고 Polars 등 사용하고 계신 모듈이 있다면 기존 모듈과도 연계가 잘된다고 느꼈습니다.

 

 

참고

https://duckdb.org/

 

An in-process SQL OLAP database management system

DuckDB is an in-process SQL OLAP database management system. Simple, feature-rich, fast & open source.

duckdb.org

 

https://github.com/duckdb/duckdb

 

GitHub - duckdb/duckdb: DuckDB is an analytical in-process SQL database management system

DuckDB is an analytical in-process SQL database management system - duckdb/duckdb

github.com

 

 

https://zzsza.github.io/data-engineering/2024/10/25/duckdb/

 

DuckDB 사용법(DuckDB Python + Jupyter Lab)

이 글은 DuckDB 사용법을 작성한 글입니다 예상 독자 DuckDB가 궁금하신 분 데이터 분석가 : Pandas가 느리다고 생각해서 다른 대안을 찾고 있는 분 데이터 엔지니어 : 데이터 엔지니어링의 Transform 영

zzsza.github.io

 

https://digitalbourgeois.tistory.com/831

 

DuckDB의 분산 컴퓨팅 도전? DeepSeek의 smallpond 분석

🔍 DuckDB가 분산 컴퓨팅을 지원한다고?DuckDB는 뛰어난 성능과 간편한 사용성으로 많은 데이터 엔지니어들에게 사랑받는 분석용 데이터베이스입니다. 하지만 본질적으로 싱글 노드(In-process) 실행

digitalbourgeois.tistory.com