Trino SQL Bài học 4: Cấu trúc phân cấp không gian lưu trữ (Catalog, Schema, Table)
Mục tiêu bài học:
-
Nắm vững cách Trino định danh và phân cấp dữ liệu từ nhiều nguồn khác nhau.
-
Hiểu rõ khái niệm Fully Qualified Name (Tên định danh đầy đủ).
-
Biết cách sử dụng
information_schemavàsystemcatalog để truy xuất siêu dữ liệu (metadata).
1. Mô hình phân cấp 3 tầng trong Trino
Bởi vì Trino có khả năng kết nối đồng thời với rất nhiều nguồn dữ liệu (MySQL, PostgreSQL, MongoDB, HDFS, S3...), nó cần một cấu trúc đặt tên chuẩn hóa để tránh xung đột và giúp hệ thống nhận diện chính xác dữ liệu cần truy vấn.
Cấu trúc này được chia thành 3 tầng: Catalog > Schema > Table.
A. Catalog (Nguồn dữ liệu / Cổng kết nối)
Catalog là tầng cao nhất trong hệ thống định danh của Trino. Mỗi Catalog đại diện cho một nguồn dữ liệu cụ thể và được gắn liền với một Connector.
-
Khi bạn tạo file
mysql.propertiestrong thư mụcetc/catalog/, bạn đang tạo ra một Catalog tên làmysql. -
Một cụm Trino có thể có nhiều Catalog. Bạn có thể có
mysql_prod,mysql_staging,hive_datalake, v.v. -
Lệnh xem danh sách:
SHOW CATALOGS;
B. Schema (Không gian tên / Cơ sở dữ liệu)
Bên trong một Catalog sẽ chứa nhiều Schema. Khái niệm Schema trong Trino sẽ được ánh xạ tương ứng với cách tổ chức của hệ thống lưu trữ gốc:
-
Đối với MySQL/PostgreSQL: Schema trong Trino tương đương với một Database (hoặc Schema) trong hệ quản trị đó.
-
Đối với MongoDB: Schema tương đương với một Database.
-
Khởi tạo Schema mới (nếu Connector hỗ trợ):
CREATE SCHEMA mysql.analytics; -
Lệnh xem danh sách:
SHOW SCHEMAS FROM mysql;
C. Table (Bảng dữ liệu)
Đây là tầng thấp nhất chứa cấu trúc cột và dòng thực tế.
-
Bảng được quản lý hoàn toàn bởi hệ thống lưu trữ gốc, Trino chỉ đọc siêu dữ liệu (tên cột, kiểu dữ liệu) để tính toán.
-
Lệnh xem danh sách:
SHOW TABLES FROM mysql.analytics;
2. Fully Qualified Name (Định danh tuyệt đối)
Khi làm việc với các hệ thống đơn luồng (như gõ SQL trong MySQL), bạn thường chỉ cần gọi tên bảng: SELECT * FROM users.
Trong Trino, vì bạn đang truy vấn đa nguồn, bạn phải cung cấp lộ trình chính xác để Trino biết bảng users này nằm ở đâu. Lộ trình này gọi là Fully Qualified Name với cú pháp:
SQL
catalog_name.schema_name.table_name
Ví dụ thực tế: Bạn muốn JOIN dữ liệu khách hàng từ PostgreSQL với lịch sử mua hàng trên hệ thống Hive:
SQL
SELECT
c.customer_name,
o.order_date,
o.total_amount
FROM postgres.public.customers AS c
JOIN hive.sales_data.orders AS o
ON c.customer_id = o.customer_id;
Nếu bạn thấy việc gõ tên đầy đủ quá dài dòng cho các truy vấn đơn lẻ, bạn có thể thiết lập ngữ cảnh mặc định bằng lệnh USE:
SQL
-- Đặt ngữ cảnh mặc định là Catalog 'hive' và Schema 'sales_data'
USE hive.sales_data;
-- Lúc này, bạn có thể gọi trực tiếp tên bảng
SELECT * FROM orders;
3. Khám phá Metadata với Information Schema
Mọi Catalog trong Trino đều tự động được tạo ra một Schema ẩn có tên là information_schema. Đây là nơi chứa siêu dữ liệu (metadata) về cấu trúc của chính Catalog đó theo chuẩn ANSI SQL.
Các bảng quan trọng bên trong information_schema bao gồm:
-
tables: Danh sách tất cả các bảng. -
columns: Danh sách tất cả các cột của các bảng cùng kiểu dữ liệu. -
views: Danh sách các View đã được tạo.
Ứng dụng thực tế: Tìm kiếm tất cả các bảng có chứa cột mang tên email trong Catalog mysql.
SQL
SELECT table_schema, table_name
FROM mysql.information_schema.columns
WHERE column_name = 'email';
4. System Catalog (Trái tim của hệ thống)
Ngoài các Catalog do bạn tự định nghĩa, Trino luôn chạy ngầm một Catalog mặc định tên là system. Catalog này không chứa dữ liệu kinh doanh mà chứa thông tin cấu hình và trạng thái nội bộ của cụm Trino (Cluster).
Bên trong system có các schema như metadata và runtime.
Kiểm tra các node (Worker) đang hoạt động trong cụm:
SQL
SELECT node_id, http_uri, node_version, state
FROM system.runtime.nodes;
Xem lịch sử các truy vấn vừa chạy:
SQL
SELECT query_id, state, user, query
FROM system.runtime.queries
ORDER BY created DESC
LIMIT 10;
Việc phân cấp lưu trữ thống nhất giúp Trino trừu tượng hóa mọi rào cản kỹ thuật giữa các Database, biến toàn bộ hạ tầng dữ liệu của bạn thành một kho chứa khổng lồ duy nhất dưới lăng kính của SQL.
All rights reserved