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 등 사용하고 계신 모듈이 있다면 기존 모듈과도 연계가 잘된다고 느꼈습니다.
참고
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
'IT 기술 > 데이터엔지니어링' 카테고리의 다른 글
k8s에 Airflow helm 으로 배포하기 - dags,logs 폴더 마운트 (0) | 2025.02.26 |
---|---|
[Spark] Structured Streaming으로 실시간 데이터 처리하기 - Databricks 활용 (0) | 2024.12.16 |
[Spark] Spark 실행 방식 - SparkDriver, ClusterManager (1) | 2024.12.05 |
[Spark] Shuffle 이란? - Wide Transformation, Narrow Transformation (0) | 2024.11.28 |
[Spark]UDF 의 정의 및 사용 방법 + UDF 별 수행 속도차이(PySpark)- 24.11 (1) | 2024.11.27 |