Tóm tắt
Các hồ dữ liệu đám mây thường lưu trữ một lượng lớn nhật ký, chỉ số hoặc dữ liệu sự kiện trên AWS S3. Các định dạng này rất đa dạng: từ JSON phân cách bằng dòng (thường được nén bằng gzip), CSV, đến các định dạng cột tối ưu hơn như Parquet. Thông thường, việc truy vấn dữ liệu này yêu cầu phải khởi động các công cụ nặng nề như Athena, Spark, Presto, hoặc EMR.
Nhưng nếu bạn có thể truy vấn dữ liệu ngay lập tức, từ máy tính xách tay của mình, mà không phải thiết lập một cụm máy chủ nào? Đó chính là lý do bạn nên biết đến DuckDB.
DuckDB là một cơ sở dữ liệu phân tích nhúng - hãy tưởng tượng “SQLite cho phân tích” - với hỗ trợ tốt nhất cho Parquet, JSON, CSV, và lưu trữ từ xa như S3. Những giấc mơ đã trở thành hiện thực.
Trong bài viết này, chúng ta sẽ khám phá:
- Truy vấn các tệp JSON nén từ S3
- So sánh hiệu suất giữa JSON, Parquet và CSV
- Kết hợp dữ liệu cục bộ và từ xa
- Gọi các API HTTP từ DuckDB (đúng vậy, bạn có thể!)
Bắt đầu với DuckDB
DuckDB hoạt động trên Python, R, Go, Nodejs, Rust, Java, CLI, hoặc như một thư viện C. Nếu bạn là fan của JetBrains DataGrip, nó cũng có thể bao gồm kết nối DuckDB. CLI của DuckDB (Giao diện dòng lệnh) là một tệp thực thi đơn giản, không cần phụ thuộc. Việc cài đặt rất đơn giản.
pip install duckdb
brew install duckdb
1. Truy vấn Dữ liệu Cục bộ
Sau khi khởi động CLI, chúng ta có thể dễ dàng truy cập các tệp csv được lưu trữ trên hệ thống tệp cục bộ, truy vấn chúng như thể chúng là các bảng thông thường, sử dụng các toán tử và điều kiện SQL. Rất thường xuyên, chúng ta cần mở một số tệp CSV, phân tích cấu trúc của chúng hoặc trích xuất các hàng cụ thể dựa trên điều kiện. Dưới đây là một ví dụ truy vấn dữ liệu từ tệp CSV cục bộ với giới hạn:
SELECT *
FROM read_csv_auto('/tmp/oxford_5000.csv') LIMIT 100;
| column0 | word | type | cefr | phon_br | phon_n_am | definition | example |
|---|---|---|---|---|---|---|---|
| 0 | a | mạo từ không xác định | a1 | /ə/ | /ə/ | được sử dụng trước danh từ đếm được hoặc số ít đề cập đến người hoặc vật chưa được đề cập trước đó | một người/ ngựa/ đơn vị |
| 1 | abandon | động từ | b2 | /əˈbændən/ | /əˈbændən/ | rời bỏ ai đó, đặc biệt là ai đó mà bạn có trách nhiệm, mà không có ý định quay lại | bỏ rơi ai đó, Đứa trẻ đã bị mẹ bỏ rơi. |
| 2 | ability | danh từ | a2 | /əˈbɪləti/ | /əˈbɪləti/ | thực tế là ai đó/cái gì đó có khả năng làm một cái gì đó | Những người mắc bệnh có thể mất khả năng giao tiếp. |
2. Truy vấn JSON nén trên AWS S3
Giả sử bạn có nhật ký hoặc dữ liệu sự kiện được đưa vào DataLake qua pipeline và chúng được lưu trữ trên AWS S3, phân chia theo ngày với một đường dẫn ảo và cũng được nén bằng JSON. Đây là kiến trúc rất phổ biến.
DuckDB hoạt động hoàn hảo với các phân vùng, dựa trên truy vấn, nó có thể truy cập các đường dẫn phù hợp và cũng giải nén dữ liệu. Nó tự động phát hiện schema, ngay cả khi có nhiều tệp.
s3://my-bucket/logs/year=2025/month=09/day=16/data.json.gz
Truy vấn trực tiếp dữ liệu với DuckDB:
SELECT *
FROM read_json_auto(
's3://my-bucket/logs/*.json.gz',
format = 'json',
compression = 'gzip'
);
Điều tuyệt vời là chúng ta không cần phải khởi động bất kỳ động cơ nào, tạo quyền IAM AWS, thêm dịch vụ và trả tiền cho chúng - chỉ cần sử dụng công cụ CLI mà cài đặt trên máy của bạn.
Các tiện ích mở rộng của DuckDB và thông tin xác thực AWS
Tiện ích mở rộng httpfs hỗ trợ đọc/ghi/tìm kiếm tệp trên các máy chủ lưu trữ đối tượng bằng cách sử dụng API S3. S3 cung cấp một API tiêu chuẩn để đọc và ghi vào các tệp từ xa (trong khi các máy chủ http thông thường, trước khi S3 ra đời, không cung cấp API ghi chung). DuckDB tuân thủ API S3, hiện đã trở thành tiêu chuẩn giữa các nhà cung cấp lưu trữ trong ngành.
Để truy vấn S3, trước tiên chúng ta cần thêm và kích hoạt các tiện ích mở rộng:
-- set s3 compatibility
INSTALL
httpfs;
LOAD
httpfs;
Hệ thống tệp httpfs được kiểm tra với AWS S3, Minio, Google Cloud và lakeFS. Các dịch vụ khác thực hiện API S3 (như Cloudflare R2)
Sau khi thiết lập, thêm thông tin xác thực S3 thông qua biến môi trường (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY) hoặc vai trò IAM của hồ sơ (được ưu tiên hơn).
Thêm thông tin bí mật
-- set aws creds
INSTALL
aws;
LOAD
aws;
CREATE
SECRET env_dev (
TYPE s3,
PROVIDER credential_chain,
REFRESH auto
);
SET
s3_region='us-east-1';
SET
s3_access_key_id='ASIAXXXXXX';
SET
s3_secret_access_key='';
SET
s3_session_token='';
Một tùy chọn khác là sử dụng các hồ sơ AWS hiện có và chuyển đổi giữa chúng
CALL load_aws_credentials('dev');
CALL load_aws_credentials('prod');
Kiểm tra thông tin xác thực:
SELECT *
FROM duckdb_secrets();
3. Parquet và CSV trên S3
DuckDB nổi bật với các định dạng cột như Parquet:
SELECT user_id, COUNT(*) AS events
FROM read_parquet('s3://my-bucket/logs/*.parquet')
GROUP BY user_id
ORDER BY events DESC;
Đối với CSV:
SELECT *
FROM read_csv_auto('s3://my-bucket/data/*.csv.gz');
Parquet nhanh hơn và nhỏ hơn nhiều so với JSON/CSV, nhưng điều kỳ diệu là DuckDB xử lý tất cả chúng.
4. Tải Dữ liệu từ S3 và lưu cục bộ dưới dạng Parquet hoặc định dạng khác
-- dev
CREATE
OR REPLACE VIEW events_2025_block AS
SELECT *
FROM read_json_auto(
's3://events/block-events/block/year=2025/month=*/day=*/hour=*/*.json.gz',
filename = true, -- thêm cột _filename
hive_partitioning = 1, -- kéo năm/tháng/ngày/giờ từ đường dẫn vào các cột
format = 'newline_delimited' -- bỏ qua nếu chúng là mảng/đối tượng; giữ lại nếu là NDJSON
);
SELECT *
FROM events_2025_block
WHERE
action == 'data-verified'
LIMIT 10;
Viết dữ liệu đã trích xuất từ S3 vào hệ thống tệp cục bộ và tự động chuyển đổi thành Parquet :
COPY events_2025_block TO '/tmp/dev.s3.events.parquet' (FORMAT parquet);
SELECT *
FROM '/tmp/dev.s3.events.parquet'
WHERE action == 'data-verified'
ORDER BY created_at DESC
LIMIT 100;
5. Kết hợp Dữ liệu Cục bộ và Từ xa
Bạn có thể kết hợp dữ liệu từ S3 với các tập dữ liệu cục bộ:
WITH s3_data AS (
SELECT user_id, timestamp
FROM read_parquet('s3://my-bucket/events/*.parquet')
),
local_users AS (
SELECT * FROM read_csv_auto('users.csv')
)
SELECT u.name, COUNT(*) AS actions
FROM s3_data s
JOIN local_users u USING(user_id)
GROUP BY u.name;
Điều này có nghĩa là bạn không cần phải ETL mọi thứ vào một cơ sở dữ liệu trung tâm chỉ để truy vấn.
6. Gọi API HTTP từ DuckDB
DuckDB hỗ trợ đọc các URL HTTP từ xa trực tiếp. Tôi có một tệp JSON chứa các tin tức AWS cho các chủ đề khác nhau được lưu trữ tại github pages của mình, hãy gọi nó để lấy tin tức kiến trúc AWS mới nhất:
SELECT *
FROM read_json_auto('https://tsypuk.github.io/aws-news/news/architecture.json')
WHERE title LIKE '%Lambda%' LIMIT 50;
| title | link |
|---|---|
| Cách Zapier chạy các tác vụ cô lập trên AWS Lambda và nâng cấp chức năng quy mô | https://aws.amazon.com/blogs/architecture/how-zapier-runs-isolated-tasks-on-aws-lambda-and-upgrades-functions-at-scale/ |
| Cách Launchpad từ Pega cho phép mở rộng SaaS an toàn với AWS Lambda | https://aws.amazon.com/blogs/architecture/how-launchpad-from-pega-enables-secure-saas-extensibility-with-aws-lambda/ |
Các truy vấn tương tự hoạt động với Parquet/CSV được lưu trữ qua HTTPS. Điều này rất tiện lợi để kết hợp dữ liệu từ API + S3.
7. Sử dụng các cơ sở dữ liệu tiêu chuẩn như MySQL, Postgres
INSTALL postgres;
LOAD postgres;
ATTACH 'dbname=postgres user=postgres host=127.0.0.1' AS db (TYPE postgres, READ_ONLY);
Tại sao chọn DuckDB?
- Nhẹ: Không cần cụm máy, có thể chạy ở bất kỳ đâu (máy tính xách tay, container, Lambda).
- Định dạng linh hoạt: JSON, CSV, Parquet, ORC.
- Nhanh: động cơ thực thi vector hóa, tối ưu cho phân tích.
- Tuyệt vời cho việc khám phá dữ liệu đột xuất từ hồ dữ liệu.
Khi nào sử dụng Athena so với DuckDB
- Sử dụng Athena khi: các truy vấn phải chạy ở quy mô lớn, nhiều nhóm cần truy cập SQL, phân tích phức tạp yêu cầu nhiều CPU/memory mà không có sẵn trên máy cục bộ.
- Sử dụng DuckDB khi: bạn cần khám phá nhanh, prototyping, khoa học dữ liệu, hoặc nhúng phân tích trong một ứng dụng, truy cập vào môi trường QA/STG mà không có kích thước khối lượng lớn.
Kết luận
DuckDB giống như một con dao Swiss Army cho các hồ dữ liệu. Chỉ với vài dòng SQL, bạn có thể truy vấn JSON nén từ S3, kết hợp nó với các tệp CSV cục bộ, so sánh với Parquet, và thậm chí gọi các API. Nó nhẹ, nhanh và tuyệt vời cho cả việc prototyping và nhúng vào sản xuất.
Hãy thử nó vào lần tới khi bạn cần xem qua bucket S3 của mình mà không cần khởi động một cụm big-data đầy đủ.