0

Làm thế nào để viết câu lệnh SQL truy vấn trực tiếp vào hàng triệu file Parquet nằm trên Amazon S3 mà không cần chèn vào Database?

Để giải quyết bài toán "truy vấn hàng triệu file Parquet trên S3 mà không cần nạp vào Database", công nghệ mà chúng ta cần sử dụng được gọi là Serverless Query Engine (Động cơ truy vấn không máy chủ) hoặc Data Lakehouse [cite: x].

Thay vì phải tốn thời gian và tiền bạc để chạy các lệnh INSERT dữ liệu vào một database truyền thống (như MySQL hay PostgreSQL), hệ thống sẽ map (ánh xạ) trực tiếp cấu trúc thư mục trên S3 thành một bảng ảo, và đọc file on-the-fly (ngay lúc chạy lệnh) [cite: x].

Dưới đây là 2 cách phổ biến và mạnh mẽ nhất để làm việc này [cite: x].


Cách 1: Sử dụng Amazon Athena (Giải pháp Native của AWS)

Nếu dữ liệu đã nằm sẵn trên S3, Amazon Athena là lựa chọn số một [cite: x]. Athena bản chất là một engine dựa trên Presto/Trino được AWS tối ưu hóa [cite: x]. Bạn không cần dựng server, chỉ cần viết SQL, AWS sẽ tính tiền dựa trên dung lượng dữ liệu bạn quét (khoảng 5$/TB) [cite: x].

Bước 1: Khai báo cấu trúc bảng (DDL)

Bạn mở giao diện Athena và viết một câu lệnh CREATE EXTERNAL TABLE để "báo" cho hệ thống biết cấu trúc file Parquet của bạn trông như thế nào và nó nằm ở đâu trên S3 [cite: x].

CREATE EXTERNAL TABLE IF NOT EXISTS user_analytics (
    id BIGINT,
    username STRING,
    age INT,
    country STRING,
    created_at TIMESTAMP
)
STORED AS PARQUET
LOCATION 's3://bo-doi-data-lake/production/users/'
tblproperties ("parquet.compress"="SNAPPY");

Bước 2: Truy vấn bằng SQL chuẩn

Ngay khi chạy xong lệnh trên, bạn có thể viết SQL như đang dùng MySQL/PostgreSQL thông thường [cite: x]. Athena sẽ tự động chui vào bucket S3, gom hàng triệu file Parquet lại và trả về kết quả trong vài giây [cite: x]:

SELECT country, AVG(age) as average_age, COUNT(id) as total_users
FROM user_analytics
WHERE created_at >= TIMESTAMP '2026-01-01 00:00:00'
GROUP BY country
ORDER BY total_users DESC;

Cách 2: Sử dụng DuckDB (Vũ khí hạng nặng cho Developer)

Nếu bạn đang code Backend (bằng Go, Node.js, hay Python) và muốn truy vấn S3 trực tiếp từ chính con server app của mình mà không cần qua dịch vụ của AWS, thì DuckDB hiện tại là chân ái [cite: x]. DuckDB được mệnh danh là "SQLite cho phân tích dữ liệu" [cite: x].

Chỉ với vài dòng lệnh, DuckDB có thể stream dữ liệu trực tiếp từ S3 về và query cực kỳ tốc độ [cite: x]:

-- Cài đặt và cấu hình chứng chỉ AWS trong DuckDB
INSTALL httpfs;
LOAD httpfs;

SET s3_region='ap-southeast-1';
SET s3_access_key_id='YOUR_ACCESS_KEY';
SET s3_secret_access_key='YOUR_SECRET_KEY';

-- Truy vấn trực tiếp hàng loạt file Parquet dùng wildcard (*)
SELECT country, COUNT(*) 
FROM read_parquet('s3://bo-doi-data-lake/production/users/**/*.parquet')
WHERE age > 25
GROUP BY country;

💡 Bí kíp tối ưu chi phí và tốc độ (Senior Data Engineering)

Vì Athena hay các engine đọc file S3 tính tiền dựa trên lượng dữ liệu quét, nếu bạn có 10TB file Parquet mà cứ dùng SELECT * thì sẽ cực kỳ tốn kém và chậm chạp [cite: x]. Để giải quyết, hãy áp dụng 2 nguyên tắc sau [cite: x]:

  1. Chỉ SELECT các cột cần thiết: Vì Parquet lưu theo cột (như đã nói ở bài trước), lệnh SELECT age, country sẽ bỏ qua hoàn toàn các cột khác trên ổ đĩa, giúp tiết kiệm 80-90% chi phí I/O [cite: x].
  2. Sử dụng Partitioning (Phân vùng thư mục trên S3): Hãy tổ chức cấu trúc thư mục S3 theo dạng [cite: x]: s3://bucket/users/year=2026/month=08/day=06/file.parquet Khi bạn query WHERE year='2026' AND month='08', engine sẽ thông minh bỏ qua toàn bộ dữ liệu của các năm/tháng khác, giúp query hàng tỷ bản ghi chỉ trong chớp mắt [cite: x].

All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.