Trong lĩnh vực khoa học dữ liệu và phân tích, việc rút trích thông tin từ dữ liệu thường bao gồm một chuỗi bước, thường được thực hiện trong Python với các thư viện như pandas. Dù mạnh mẽ, pandas có thể gặp vấn đề về hiệu năng với các bộ dữ liệu lớn và các thao tác tiêu tốn tài nguyên.
Nhằm cân bằng giữa tính năng mạnh và hiệu suất, DuckDB nổi lên như một lựa chọn thay thế tuyệt vời. Là một cơ sở dữ liệu phân tích tốc độ cao, thân thiện với người dùng, DuckDB đang thay đổi cách xử lý dữ liệu trong Python và R.
Bài viết này sẽ đề cập đến:
- Những tính năng và khả năng độc đáo của DuckDB
- Ưu điểm của DuckDB so với các công cụ thao tác dữ liệu truyền thống
- Các trường hợp sử dụng thực tế cho thấy tiềm năng của DuckDB
- Hướng dẫn làm việc với DuckDB trong Python và R
Kết thúc bài viết, bạn sẽ hiểu vì sao DuckDB là công cụ đáng cân nhắc cho các tác vụ phân tích dữ liệu của bạn, bất kể kích thước dữ liệu và mức độ phức tạp của các thao tác liên quan.
DuckDB là gì?
DuckDB là một Hệ Quản Trị Cơ Sở Dữ Liệu (DBMS) xử lý phân tích trực tuyến (OnLine Analytical Processing - OLAP) miễn phí, mã nguồn mở, nhúng, chạy trong tiến trình và quan hệ. Có khá nhiều thuật ngữ và viết tắt ở đây, hãy cùng bóc tách:
- Chạy trong tiến trình (in-process) nghĩa là các tính năng DBMS chạy ngay bên trong ứng dụng bạn đang truy cập, thay vì một tiến trình bên ngoài mà ứng dụng của bạn phải kết nối tới
- OLAP nghĩa là cơ sở dữ liệu được thiết kế cho phân tích dữ liệu. Cũng có các cơ sở dữ liệu xử lý giao dịch trực tuyến (OLTP), được thiết kế để xử lý khối lượng lớn dữ liệu giao dịch.
Điểm khác biệt chính giữa OLAP và OLTP là cách lưu trữ dữ liệu. Cơ sở dữ liệu OLTP thường lưu dữ liệu theo bản ghi, đồng thời đảm bảo toàn bộ dữ liệu liên quan đến một bản ghi được lưu gần nhau trong bộ nhớ. Chúng cũng được tối ưu cho việc đọc và ghi các hàng một cách hiệu quả.
Ngược lại, cơ sở dữ liệu OLAP thường được tổ chức theo cột, nghĩa là dữ liệu được sắp xếp theo các cột. Tất cả dữ liệu liên quan đến một cột được lưu gần nhau trong bộ nhớ, và cơ sở dữ liệu được tối ưu để đọc và tính toán trên các cột một cách hiệu quả.
Vì DuckDB là một cơ sở dữ liệu OLAP, bất kỳ dữ liệu nào được lưu trữ đều được tổ chức theo cột. Ngoài ra, DuckDB được tối ưu để thực hiện các truy vấn phức tạp trên dữ liệu (ví dụ: join, tổng hợp, nhóm, v.v.) – hãy xem lộ trình kỹ năng SQL Fundamentals để tìm hiểu thêm.
Nếu bạn quen với SQLite, cách dễ nhất để hình dung DuckDB là một phiên bản tập trung vào phân tích của nó. Đây là lý do DuckDB được ưa chuộng — nó tận dụng sự đơn giản của SQLite và các chức năng của Snowflake ngay trên máy tính cá nhân. DuckDB lấp đầy nhu cầu về một giải pháp cơ sở dữ liệu nhúng cho xử lý phân tích.
Các tính năng chính của DuckDB
Hãy cùng điểm qua một số tính năng nổi bật của DuckDB.
Truy vấn phân tích nhanh
DuckDB cực kỳ nhanh; điều này có thể gây bất ngờ cho những ai quen với các cơ sở dữ liệu xử lý khối lượng công việc OLAP như PostgreSQL. Truyền thống, cơ sở dữ liệu OLAP thường có thời gian phản hồi chậm vì chúng thường xử lý nhiều dữ liệu hơn.
Tuy nhiên, DuckDB chạy trên bộ máy truy vấn dạng cột–vector hóa, giúp tận dụng hiệu quả bộ nhớ đệm CPU và tăng tốc thời gian phản hồi cho các khối công việc truy vấn phân tích.
Hỗ trợ SQL và tích hợp với các ngôn ngữ lập trình khác
DuckDB cho phép người dùng chạy các truy vấn SQL phức tạp và cung cấp API cho Java, C, C++, và nhiều ngôn ngữ khác. Nó cũng tích hợp sâu với Python và R, cho phép người dùng thực hiện phân tích dữ liệu tương tác hiệu quả; vì vậy, bạn có thể tương tác với DuckDB từ ngôn ngữ lập trình ưa thích. Ngoài ra còn có thêm các từ khóa SQL giúp việc viết truy vấn dễ dàng hơn, như EXCLUDE, REPLACE và ALL.
Lưu ý: DuckDB không có phụ thuộc bên ngoài, vì vậy bạn không phải lo về các vấn đề phụ thuộc.
Miễn phí & mã nguồn mở
DuckDB là mã nguồn mở và có nhiều cộng tác viên tích cực, đồng nghĩa với việc các phát triển và cải tiến có thể được triển khai nhanh chóng. Nó cũng miễn phí, dù có thể không miễn phí mãi mãi.
Các trường hợp sử dụng DuckDB
Hai trường hợp sử dụng phổ biến nhất của DuckDB là phân tích dữ liệu tương tác và điện toán biên.
Hãy tìm hiểu lần lượt từng trường hợp.
Phân tích dữ liệu tương tác
Phân tích dữ liệu mô tả chuỗi các bước liên quan đến xử lý và mô hình hóa dữ liệu. Mục đích của phân tích dữ liệu là khám phá thông tin hữu ích để đưa ra kết luận và quyết định dựa trên dữ liệu.
Ngày nay, các công ty thuê các nhà khoa học dữ liệu và nhà phân tích đảm nhận trách nhiệm này, sử dụng các công nghệ như ngôn ngữ lập trình Python và R để tiến hành phân tích.
DuckDB mang đến lựa chọn tốt hơn cho những ai thích dùng SQL trong phát triển cục bộ so với SQLite, vốn gặp khó khi xử lý khối lượng công việc OLAP do thiếu các chức năng phục vụ phân tích dữ liệu.
Điện toán biên
Các cơ sở dữ liệu có thể nhúng, như DuckDB, cho phép người dùng phân tích dữ liệu tại biên. Điện toán biên là một mô hình điện toán phân tán đang nổi, đề cập đến việc đưa nhiều mạng và thiết bị đến gần hoặc ngay tại nơi cần thiết.
Xử lý dữ liệu gần nơi cần thiết giúp cải thiện thời gian phản hồi và tiết kiệm băng thông.
Bắt đầu với DuckDB
Môi trường của bạn sẽ quyết định các bước cần thiết để cài đặt DuckDB, nhưng hướng dẫn cài đặt đầy đủ có trong tài liệu DuckDB.
Nhìn chung, khá đơn giản. Bạn chỉ cần vài dòng mã vì DuckDB là giải pháp nhúng. Nó cũng không cần máy chủ và không có phụ thuộc bên ngoài.
Dưới đây là ví dụ cách cài đặt DuckDB bằng Python:
pip install duckdb==0.8.0
Và trong R:
install.packages("duckdb")
Giờ hãy xem một số ví dụ mã.
Làm việc với DuckDB trong Python
Sau khi cài đặt DuckDB, việc bắt đầu khá đơn giản. Bạn chỉ cần import duckdb vào môi trường của mình, rồi kết nối đến một cơ sở dữ liệu hiện có hoặc tạo mới nếu cần.
Ví dụ:
import duckdb
connection = duckdb.connect()
Vì không truyền tệp cơ sở dữ liệu làm tham số cho phương thức connect(), một cơ sở dữ liệu mới sẽ được tạo.
Tuy nhiên, cách đơn giản nhất để bắt đầu thực thi các truy vấn SQL với DuckDB là dùng phương thức sql().
# Source: Basic API usage - https://duckdb.org/docs/api/python/overview.html
import duckdb
duckdb.sql('SELECT 42').show()
Chạy lệnh này sẽ khởi tạo một cơ sở dữ liệu trong bộ nhớ được lưu toàn cục trong mô-đun Python và trả về một “relation”, về bản chất là biểu diễn ký hiệu của truy vấn.
Lưu ý, truy vấn sẽ không được thực thi cho đến khi kết quả được yêu cầu một cách tường minh, như sau:
# Source: Execute SQL - https://duckdb.org/docs/guides/python/execute_sql.html
results = duckdb.sql('SELECT 42').fetchall()
print(results)
"""
[(42,)]
"""
Chúng ta cũng có thể dùng phương thức df() để chuyển đổi dữ liệu thành Pandas DataFrame:
results_df = duckdb.sql('SELECT 42').df()
print(results)
"""
42
0 42
"""
Hoặc bạn có thể dùng một trong nhiều phương thức nạp dữ liệu để đọc dữ liệu vào bộ nhớ:
# Source: Python API - https://duckdb.org/docs/api/python/overview.html
import duckdb
duckdb.read_csv('example.csv') # read a CSV file into a Relation
duckdb.read_parquet('example.parquet')# read a Parquet file into a Relation
duckdb.read_json('example.json') # read a JSON file into a Relation
duckdb.sql('SELECT * FROM "example.csv"') # directly query a CSV file
Tuyên bố miễn trừ trách nhiệm: Nếu bạn dùng phương thức sql() mà không kết nối trước tới một cơ sở dữ liệu hiện có, mọi dữ liệu bạn lưu trong các tệp sẽ bị mất sau khi tắt chương trình. Bạn có thể tránh điều này bằng cách thiết lập kết nối bằng phương thức connect() như đã đề cập ở đầu phần này.
Kết luận và Tài nguyên bổ sung
DuckDB là một cơ sở dữ liệu OLAP được các chuyên gia dữ liệu, như nhà khoa học dữ liệu và nhà phân tích, sử dụng để phân tích dữ liệu một cách nhanh chóng và hiệu quả. Nó tận dụng bộ máy thực thi truy vấn SQL có khả năng chạy các truy vấn phức tạp trên những bộ dữ liệu lớn.
DuckDB cũng tích hợp với nhiều ngôn ngữ lập trình khác, vì vậy bạn có thể truy cập nó từ ngôn ngữ ưa thích của mình.
Để tiếp tục học, hãy xem SQL Basics Cheat Sheet và cách DuckDB đưa SQL trở thành “công dân hạng nhất” trong DataLab.
