본문 바로가기
데이터&AI/데이터분석

duckDB를 사용해보기 (feat. 가볍다, 근대 성능은 좋아!!? )

by 일등박사 2024. 8. 30.
728x90

DuckDB란 무엇인가요?!!

DuckDB를 쉽게표현하면 SQL무새입니다!!!

뭐든지간에 SQL로 표현할수 있도록 해줘요!!

 

DuckDB의 주요 특징

  • 가벼움: DuckDB는 매우 가볍고, 추가적인 서버 설정이 필요 없습니다.
  • SQL 지원: 완전한 SQL 기능을 제공하여 복잡한 쿼리 작성이 가능합니다.
  • 내장형: DuckDB는 별도의 서버 프로세스가 필요 없으며, 로컬 파일로 모든 작업을 처리할 수 있습니다.
  • 열지향성: 열지향형 데이터베이스로, 대용량 데이터를 다룰 때 뛰어난 성능을 발휘합니다.
  • Pandas와 통합: Pandas 데이터프레임과 쉽게 통합되어 데이터 처리 및 분석을 간편하게 수행할 수 있습니다.

제일 중요한 예제!!!! 

1. 우선 사용전, pkg를 설치해줍니다!!

pip install duckdb

 

DuckDB를 Python에서 사용하려면 먼저 패키지를 설치해야 합니다.

 

2. 이제 간단한 Python 기본 DF 예제로 확인해보아요!!

 - 사용할 데이터!!

import duckdb
import pandas as pd

# 샘플 데이터를 만들고!!
data = {
    'name': ['홍길동', '강영자', '이기욱', '황덕호'],
    'age': [24, 27, 22, 32],
    'city': ['대구', '광주', '서울', '제주']
}

df = pd.DataFrame(data)
df

 

3. DF를 메모리로 연결해서 SQL사용해 버리기!!

# DuckDB에서 데이터프레임을 SQL 테이블로 변환하여 쿼리하기
con = duckdb.connect(database=':memory:')  # 메모리 내 DB 연결
## df라는 데이터 프레임에서 people이라는 Table만들고!!
con.execute("CREATE TABLE people AS SELECT * FROM df")
## 익숙한 쿼리문으로 쿼리!!
result = con.execute("SELECT * FROM people WHERE age > 25").fetchdf()
result

결과는??? 나이가 25세이상인 사람을 불러옵니다!!!

 

4. 이번엔 CSV 파일 읽어와서 SQL 사용해기!!!!

## csv로 저장한다음!!!!
df.to_csv('duckDB_sample.csv')

# DuckDB에 연결
con = duckdb.connect(database=':memory:')

# CSV 파일을 직접 테이블로 로드 >> csv 파일을 명시해야함!!!
con.execute("CREATE TABLE my_table AS SELECT * FROM 'duckDB_sample.csv'")

# 데이터 조회
result_csv = con.execute("SELECT * FROM my_table WHERE city = '서울'").fetchdf()
print(result_csv)
result_csv

 

아주 잘해버리쥬!?

 

 

5. 마지막으로!! 당연히 잘될거같지만,, pkl 바탕으로 해봅시다!!!

(그런데,,피클은 바로읽어오진 않고 ,DF로 불러온다음!! 쿼리하네용)

df.to_pickle('duckDB_sample.pkl')
# DuckDB에 연결
con = duckdb.connect(database=':memory:')

# Pickle 파일 로드 및 테이블로 저장
df_loaded = pd.read_pickle('duckDB_sample.pkl')
con.execute("CREATE TABLE pickle_table AS SELECT * FROM df_loaded")

# 데이터 조회
result_pkl = con.execute("SELECT * FROM pickle_table WHERE name = '강영자'").fetchdf()
result_pkl

당연히 잘되쥬~~

 

6. 근데,, 니 정말 빠르나!? pandas와 계산속도를 비교해봅시다!!

 >> 숫자데이터 1000만개 만들어서 필터링해보기 고고싱!!

import duckdb
import pandas as pd
import numpy as np
import time

# 대규모 데이터 생성
N = 10**7  # 1000만 개의 행
data = {
    'id': np.arange(N),
    'value': np.random.rand(N),
    'category': np.random.choice(['A', 'B', 'C', 'D'], N)
}

df = pd.DataFrame(data)

# Pandas에서 필터링 작업
start_time = time.time()
filtered_pandas = df[(df['value'] > 0.5) & (df['category'] == 'A')]
pandas_time = time.time() - start_time
print(f"Pandas 필터링 시간: {pandas_time:.4f} 초")

# DuckDB에서 필터링 작업
con = duckdb.connect(database=':memory:')
con.execute("CREATE TABLE df AS SELECT * FROM df")

start_time = time.time()
filtered_duckdb = con.execute("SELECT * FROM df WHERE value > 0.5 AND category = 'A'").fetchdf()
duckdb_time = time.time() - start_time
print(f"DuckDB 필터링 시간: {duckdb_time:.4f} 초")

# 결과 출력
print(f"DuckDB가 Pandas보다 {pandas_time / duckdb_time:.2f}배 빠릅니다.")

비교해본다면!!!!?

Pandas 필터링 시간: 1.0379 초
DuckDB 필터링 시간: 0.5925 초
DuckDB가 Pandas보다 1.75배 빠릅니다.

우와..진짜 빠르네!!!

결론

DuckDB는 다양한 데이터 소스와 쉽게 통합할 수 있어, CSV나 Pickle 파일을 손쉽게 SQL 쿼리로 분석할 수 있습니다.

그리고 진짜 빠릅니다!!! 그래서, 대규모 데이터 분석 작업에서 매우 유용하며

, Python 환경에서 DuckDB를 통해 SQL 기반 분석을 쉽게 수행할 수 있습니다. Python에서 SQL 기반의 데이터 분석을 손쉽게 수행하고 싶다면, DuckDB를 한 번 시도해 보세요!

(다만 Python에 너무 익숙해저버린 저는 sql보다 pandas를 가공하는게 아직.,,더 좋네요!!! 얼른SQL과 더마니마니친해져야겠어요!!)

728x90

댓글