0
0
Lập trình
NM

Truy vấn phân tích từ máy của bạn với DuckDB trên AWS S3

Đăng vào 5 tháng trước

• 7 phút đọc

Chủ đề:

#aws

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.

Copy
pip install duckdb
Copy
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:

Copy
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:

Copy
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:

Copy
-- 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

Copy
-- 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

Copy
CALL load_aws_credentials('dev');
CALL load_aws_credentials('prod');

Kiểm tra thông tin xác thực:

Copy
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:

Copy
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:

Copy
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

Copy
-- 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
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ộ:

Copy
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:

Copy
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

Copy
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 đủ.

Liên kết:

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào