DuckDB: 데이터 랭글링을 위한 내장형 DB

지난 주, ThinkWorks는 최신판Technology Radar을 출시했습니다. 플랫폼 섹션에 대한 새로운 항목 중 하나는 DuckDB 입니다. 이 새로운 DB가 재미있어 보여서 확인해 보기로 했습니다.

덕DB란?



ThinkWorks는 다음과 같이 설명합니다.

DuckDB is an embedded, columnar database for data science and analytical workloads. Analysts spend significant time cleaning and visualizing data locally before scaling it to servers. Although databases have been around for decades, most of them are designed for client-server use cases and therefore not suitable for local interactive queries. To work around this limitation analysts usually end up using in-memory data-processing tools such as Pandas or data.table. Although these tools are effective, they do limit the scope of analysis to the volume of data that can fit in memory. We feel DuckDB neatly fills this gap in tooling with an embedded columnar engine that is optimized for analytics on local, larger-than-memory data sets.



SQLite와 마찬가지로 SQL Server를 설치하고 관리할 필요 없이 SQL을 지원하는 관계형 데이터베이스입니다. 또한 메모리에 맞지 않는 대용량 데이터 세트에서도 초고속으로 최적화되어 있습니다.

테스트 드라이브



테스트 데이터 생성



데이터베이스를 테스트하려면 먼저 데이터가 필요합니다. 그래서 python script을 만들고 Faker을 사용하여 다음 CSV 파일을 만들었습니다.

persons.csv (10.000 rows)
id,name,street,city,email
1,Ronald Montgomery,300 Smith Heights Apt. 722,Shannonview,[email protected]

books.csv (10.000 rows)
1,978-0-541-64306-5,Exclusive systemic knowledge user,1,27.31

orderItems  (1.000.000 rows)
id,person_id,book_id,quantity,date
1,7001,47034,3,2020-08-16


DuckDB 설치



사용하기 위해서는 DuckDB 라이브러리를 설치해야 합니다. 이것은 pip install duckdb==0.2.2를 사용하여 수행됩니다.

시험



테스트를 위해 다음 작업을 정의했습니다. 개인 범주당 판매된 책의 총액(수량 * 가격)이 포함된 CSV 파일을 만듭니다.

이 작업을 해결하기 위한 코드입니다.

import duckdb
from time import time
start = time()

# Connect to database. 
# If no filename is specified, the db will be created in memory
conn = duckdb.connect()

# Create tables and load data from CSV files
conn.execute("CREATE TABLE persons as Select * from read_csv_auto ('persons.csv')")
conn.execute("CREATE TABLE books as Select * from  read_csv_auto ('books.csv')")
conn.execute("CREATE TABLE orderItems as Select * from  read_csv_auto ('orderItems.csv')")

# Execute the query to get the result and use copy to export it as CSV file
conn.execute("""copy (SELECT category, round(sum(quantity * price), 2) amount FROM orderItems 
inner Join persons on person_id = persons.id 
inner Join books on book_id = books.id
group by category
order by category) to 'result.csv' (HEADER)""")

# Print execution time
print("Executed in ", time() - start)


내 PC에서 실행 시간은 약 2초이고 결과 파일은 다음과 같습니다.

category,amount
1,13203562.05
2,13120658.42
3,12378199.17
4,12183193.4
5,13450846.14
6,13111841.91
7,12438200.33
8,12750379.26
9,12881481.69
10,12118417.6 


요약



이 빠른 테스트 후 DuckDB에 대해 어떻게 생각합니까? 나는 그것을 정말로 좋아한다. 저는 오랫동안 SQL을 사용해 왔으며 DuckDB 덕분에 이 기술을 다시 사용하여 데이터와 씨름할 수 있습니다. 데이터가 메모리를 초과하는 경우 메모리에서 작업하고 데이터베이스 파일을 사용하도록 원활하게 전환할 수 있습니다.

어떻게 생각해? DuckDB를 사용해 볼 준비가 되셨습니까? BTW: 그것도 plays nice with pandas.

좋은 웹페이지 즐겨찾기