- DuckDB là một công cụ SQL mã nguồn mở có thể xử lý dữ liệu bảng quy mô lớn trên một máy đơn một cách nhanh chóng và đơn giản, gần đây được sử dụng rộng rãi trong kỹ thuật dữ liệu
- Cài đặt đơn giản, không có phụ thuộc, và có thể chạy ngay trong môi trường Python nên rất phù hợp cho CI và tự động hóa kiểm thử
- Nhờ tối ưu hóa truy vấn phân tích, hiệu năng có thể nhanh hơn SQLite hoặc Postgres tới 1.000 lần, đồng thời có thể truy vấn trực tiếp nhiều định dạng tệp khác nhau như
csv, parquet, json
- Với cú pháp SQL thân thiện (
EXCLUDE, COLUMNS, QUALIFY, chuỗi hàm, v.v.) và Python API, có thể phát triển các pipeline phức tạp một cách hiệu quả
- Với tuân thủ ACID, UDF hiệu năng cao, tiện ích mở rộng tích hợp PostgreSQL, DuckDB đang nổi lên như một giải pháp thay thế lakehouse cho dữ liệu quy mô trung bình
Tổng quan về DuckDB
- DuckDB là một công cụ SQL in-process tập trung vào tối ưu hóa truy vấn phân tích
- Nó chạy bên trong ứng dụng mà không cần máy chủ riêng, không cần dịch vụ bên ngoài như Postgres
- Được tối ưu cho các phép nối và tổng hợp quy mô lớn, và có thể cho hiệu năng nhanh hơn 100~1.000 lần so với các công cụ tập trung vào giao dịch (OLTP)
- Trường hợp sử dụng chính là đọc trực tiếp các tệp lớn như
csv, parquet, json từ đĩa để xử lý hàng loạt (batch processing)
- Cũng có thể dùng cho khám phá dữ liệu nhẹ, chẳng hạn truy vấn nhanh tệp CSV từ dòng lệnh
Các đặc điểm chính
-
Tốc độ
- DuckDB là một trong những công cụ xử lý dữ liệu mã nguồn mở nhanh nhất, luôn nằm trong nhóm đầu ở các benchmark
- Khi so sánh với Polars, DataFusion, Spark, Dask, DuckDB vượt trội với dữ liệu nhỏ, còn với dữ liệu lớn thì Spark và Dask vẫn có sức cạnh tranh
-
Cài đặt đơn giản và không có phụ thuộc
- DuckDB được cung cấp dưới dạng một tệp nhị phân biên dịch sẵn duy nhất, và trong Python có thể cài ngay bằng
pip install duckdb
- Không có phụ thuộc, nên cài đặt đơn giản hơn nhiều so với các framework lớn như Spark
- Khi kết hợp với
uv, có thể thiết lập môi trường Python trong dưới 1 giây
-
CI và kiểm thử
- Nhờ khởi động nhanh và nhẹ, DuckDB rất phù hợp cho môi trường CI và kiểm thử của pipeline dữ liệu
- Trước đây, kiểm thử dựa trên Spark thường chậm và phức tạp, nhưng DuckDB giúp đơn giản hóa cấu hình môi trường và duy trì tính nhất quán với production dễ hơn
-
Trải nghiệm viết SQL
- DuckDB cho phép viết SQL và kiểm tra cú pháp rất nhanh
- Có lợi thế hơn Spark local mode hoặc AWS Athena về thực thi tức thì và phát triển lặp
- Có giao diện người dùng với tính năng tự động hoàn thành
-
Cú pháp SQL thân thiện
- DuckDB bao gồm nhiều mở rộng SQL thân thiện với người dùng
- Hỗ trợ
EXCLUDE, COLUMNS, QUALIFY, modifier tổng hợp cho hàm cửa sổ, chuỗi hàm (first_name.lower().trim()), v.v.
- Những tính năng này giúp thực hiện các tác vụ chọn và biến đổi cột phức tạp một cách ngắn gọn
-
Hỗ trợ nhiều định dạng tệp
- Có thể truy vấn dữ liệu trực tiếp từ S3, URL web, tệp cục bộ
- Cung cấp tùy chọn độ nghiêm ngặt kiểu dữ liệu cho CSV để ngăn lỗi do dữ liệu đầu vào phi cấu trúc
-
Python API
- Trong Python, có thể định nghĩa pipeline dựa trên CTE theo từng bước và dễ dàng kiểm tra dữ liệu ở mỗi bước
- Kết nối SQL theo dạng chain bằng lời gọi
duckdb.sql()
- Có thể xem kết quả trung gian mà không mất hiệu năng nhờ thực thi trì hoãn (lazy execution)
- Có thể kiểm thử hàm ở từng bước, từ đó nâng cao hiệu quả kiểm thử CI
-
Tuân thủ ACID
- DuckDB đảm bảo ACID đầy đủ ngay cả khi xử lý dữ liệu khối lượng lớn
- Nhờ đặc tính này, nó có thể được dùng như giải pháp thay thế quy mô trung bình cho các định dạng lakehouse như Iceberg và Delta Lake
-
UDF hiệu năng cao và mở rộng cộng đồng
- Có thể viết hàm do người dùng định nghĩa (UDF) hiệu năng cao bằng C++
- Thông qua Community Extensions, có thể cài tiện ích mở rộng ngay bằng lệnh như
INSTALL h3 FROM community
- Ví dụ: hỗ trợ đánh chỉ mục lục giác (h3) cho dữ liệu không gian địa lý
-
Tài liệu hóa
- Toàn bộ tài liệu được cung cấp dưới dạng một tệp Markdown duy nhất, thuận tiện cho huấn luyện LLM hoặc tìm kiếm ngay trong trình soạn thảo mã
- Tính năng gập mã giúp dễ dàng sao chép chỉ những phần cần thiết
Ứng dụng thực tế và hiệu quả
- Trong dự án mã nguồn mở Splink, việc chọn DuckDB làm backend mặc định đã mang lại
- giảm vấn đề cho người dùng, tăng tốc độ làm việc, và đơn giản hóa phát triển tính năng cũng như kiểm thử
Các tiện ích mở rộng đáng chú ý
- PostgreSQL Extension: cho phép kết nối và truy vấn trực tiếp cơ sở dữ liệu Postgres từ DuckDB
- pg_duckdb: nhúng công cụ DuckDB vào bên trong Postgres để xử lý giao dịch và phân tích song song
- Trong tương lai, sau khi tối ưu hóa chỉ mục Postgres và cải thiện filter pushup, khả năng được chấp nhận rộng rãi là rất lớn
2 bình luận
Thật mỉa mai khi dùng parq vốn dành cho xử lý phân tán với mục đích xử lý trên một máy đơn.
Ý kiến trên Hacker News
Có nhiều lý do khiến tôi thích DuckDB
Nó hỗ trợ cả tệp
.parquet,.json,.csv, và có thể đọc glob nhưselect * from 'tsa20*.csv', nên có thể xử lý hàng trăm tệp như thể là mộtDù schema khác nhau, vẫn có thể gộp dễ dàng bằng
union_by_name, và trình phân tích CSV tự động suy luận kiểu rất tốtBản WebAssembly chỉ 2MB, CLI chỉ 16MB nên cực kỳ nhỏ gọn
Nhờ vậy có thể nhúng trực tiếp vào sản phẩm. Ví dụ như Malloy
Malloy giống như phiên bản dành cho dân kỹ thuật của PowerBI hay Tableau, nhưng dùng mô hình ngữ nghĩa để giúp AI viết truy vấn tốt hơn. Cảm giác như giúp viết SQL dễ hơn gấp 10 lần
Trước đây tôi thường mất thời gian để hiểu schema trước, còn giờ thì nạp dữ liệu vào, viết các truy vấn khám phá, kiểm chứng giả định, rồi lặp lại quá trình làm sạch, biến đổi và tạo bảng
Nhờ đó tôi có thể đào sâu nhanh hơn nhiều, đồng thời phát hiện ngõ cụt sớm để bớt lãng phí thời gian
Tôi có nghe nói có một bài báo nói về cách trình phân tích CSV này hoạt động và các ý tưởng cải tiến trong tương lai, nhưng vẫn chưa tìm ra
Đặc biệt là việc ingest Parquet và JSON rất tiện, còn
clickhouse-localthì khá giống ý tưởng nhúng DuckDBCú pháp
SELECT ... FROM s3Cluster(...)cho phép ingest bằng wildcard từ bucket S3, đồng thời phân tán xử lý lên các node trong clusterCó vẻ nó cũng hỗ trợ
schema_inference_modeClickHouse cũng đã triển khai tính năng tương tự
union_by_nameTài liệu liên quan: hàm s3Cluster, schema inference, PR #55892
Nhưng Shaper dùng SQL thay vì một ngôn ngữ riêng
Nó cho phép tạo dashboard chỉ bằng SQL trên nền DuckDB
Shaper GitHub
Tốc độ của nó thật đáng kinh ngạc, và tự động phát hiện schema hoạt động chính xác trong phần lớn trường hợp
LLM cũng có thể tạo đúng SQL từ truy vấn ngôn ngữ tự nhiên
Trước đây tôi làm theo kiểu import thủ công vào SQLite, nhưng DuckDB đã khiến mọi thứ đơn giản hơn rất nhiều
Tôi cũng là người rất thích dùng DuckDB
Khi làm việc với các nhà khoa học nghiên cứu môi trường ven biển ở British Columbia, tôi phải xử lý một lượng dữ liệu khổng lồ, từ quan trắc sông băng đến dữ liệu drone biển sâu
Chúng tôi đã chọn DuckDB làm engine cho công cụ chuyển đổi dữ liệu đa dạng sinh học mới, với mục tiêu chuyển đổi và kiểm định dữ liệu theo chuẩn Darwin Core
Chúng tôi tạo bảng DuckDB động dựa trên schema rồi import dữ liệu. Nếu thất bại, hệ thống sẽ cho biết lý do ở cấp từng dòng
Toàn bộ quá trình chuyển đổi và kiểm định cũng đều được thực hiện bên trong DuckDB
Nhờ đó chúng tôi đã tạo được một ứng dụng nhanh hơn nhiều, mạnh mẽ hơn, và có thể chạy ngay trong trình duyệt
Các nhà nghiên cứu thực địa thậm chí có thể dùng offline ngay trên trình duyệt iPad
DuckDB mang lại cho tôi niềm tin rằng SQL có thể gánh phần việc nặng
Những chỗ còn thiếu an toàn kiểu dữ liệu thì chúng tôi bù lại bằng parsing và test
Mục tiêu của dự án này là giúp các nhà khoa học phân tích dữ liệu đa dạng sinh học và hệ gen bằng công cụ chung, rồi công bố lên kho lưu trữ công khai
Tôi thường xử lý HDF5 trong dữ liệu khoa học, nhưng DuckDB mặc định không hỗ trợ HDF5
Các extension hiện có vừa chậm vừa thiếu tính năng, nên tôi đã tự tạo một extension mới bằng template C++
Tôi đang tìm người quan tâm đến việc cộng tác
Cá nhân tôi thấy cú pháp Polars dễ chịu hơn SQL rất nhiều, nên đang cân nhắc liệu có đáng để thử DuckDB hay không
Chúng tôi xử lý phân tích và feed của Bluesky bằng DuckDB
Để có kết quả nhanh, chúng tôi dùng giao diện Apache Arrow, và dùng SQG để sinh code trực tiếp từ truy vấn DuckDB SQL
Tôi muốn giới thiệu dự án Java manifold-sql
Nó cho phép viết DuckDB SQL inline theo kiểu type-safe
Bạn có thể đặt SQL trực tiếp trong code và duyệt kết quả bằng
.fetch(), rất gọn gàng mà không cần tầng trung gianLập luận của tác giả hợp lý với các tác vụ xử lý dữ liệu cơ bản, nhưng
ý “phần lớn dữ liệu dạng bảng đều có thể xử lý trên một máy đơn” vẫn còn gây tranh cãi
Khi mở rộng, pivot hoặc tăng cường dữ liệu, rất dễ gặp tràn bộ nhớ (OOM)
Ngoài ra, quan điểm “SQL nên là lựa chọn đầu tiên mới cho data engineering” cũng không thực sự phù hợp với các phân tích phức tạp
Dataframe API như Polars hay pandas cũng có nhiều ưu điểm, nhưng vấn đề là hệ sinh thái chưa được chuẩn hóa nên pipeline thường xuyên phải viết lại
Phần lớn dữ liệu đều dưới 10GB, nên hoàn toàn có thể xử lý tốt trên một máy đơn
Nhiều trường hợp đang dùng Spark quá mức cần thiết
Quan điểm của tôi là “hãy thử DuckDB trước”. Với các trường hợp đơn giản, nó rất nhanh và hiệu quả
SQL tốt cho các pipeline đơn giản, nhưng tính dễ đọc còn tùy người
Cá nhân tôi thấy phía dataframe dễ đọc hơn nhiều
Phía ingestion có thể dùng nhiều Python hay Scala hơn, nhưng SQL sẽ không biến mất
OOM có lẽ chỉ là vấn đề trong các trường hợp cực đoan
Trong khi DuckDB được chú ý nhiều, Polars dường như đang bị đánh giá thấp
Tôi xử lý dữ liệu rất nhiều, và chủ yếu dùng Polars
Nó cực nhanh, lại có nhiều hàm mà pandas hay SQL khó biểu đạt
Có thể dùng trực tiếp cả hàm Python
Dù DuckDB có cùng hiệu năng đi nữa, tôi vẫn ngần ngại vì thấy SQL có vẻ có giới hạn về khả năng biểu đạt
Nó là ứng dụng độc lập nên cài đặt cũng đơn giản, gần như không có nhu cầu tuning hay đường cong học tập
Tôi đã nạp một tệp Excel có định dạng lộn xộn do mainframe tạo ra vào DuckDB,
và với tùy chọn
all_varcharthì nó được load trong chưa đến 1 giâyTrong khi đó Excel vẫn còn đang mở tệp
DuckDB rất tuyệt, nhưng việc nạp extension động xung đột với code signing nên khó dùng trong ứng dụng thương mại
Ngoài ra extension không gian còn dùng thành phần LGPL nên có vấn đề về giấy phép
Sẽ tốt hơn nếu có thể ghép tính năng theo từng package giống Apache Arrow
Ví dụ: truyền mảng qua HTTP ở tốc độ GB/s thì dùng Arrow Flight, chia sẻ tệp thì dùng Arrow IPC, đọc Parquet thì thêm một trait riêng
Hệ thống kiểu SQL của DuckDB khác Arrow nên có thể phát sinh vấn đề không khớp kiểu dữ liệu
Arrow cung cấp thư viện native cho hầu hết các ngôn ngữ
Tôi tò mò liệu với một bảng đơn chứa hàng tỷ giao dịch, 30 cột,
có thể truy xuất nhanh các trang đã được lọc bằng điều kiện WHERE hay không
Ở Postgres thì ngay cả
count(*)đơn giản cũng mất nhiều thời gianNhững lúc tôi thấy chậm thường chỉ là khi join phức tạp hoặc xử lý glob trên nhiều tệp
Nếu điều kiện WHERE chỉ là các cặp cột-giá trị đơn giản thì có thể xử lý khá nhanh
DuckDB không chỉ là một DB nhanh, mà còn có trải nghiệm nhà phát triển (devx) rất xuất sắc
Nó dễ bắt đầu nên hệ sinh thái mở rộng rất nhanh
Tích hợp Web/WASM cũng rất ấn tượng
Tôi hy vọng sẽ có thêm nhiều engine nhỏ gọn như thế này xuất hiện để thúc đẩy cạnh tranh và đổi mới