Trino SQL Bài học 42: Quản trị cấu trúc bảng chuyên sâu (DDL - CREATE, ALTER, DROP)
Mục tiêu bài học:
-
Thoát khỏi sự phụ thuộc vào dữ liệu có sẵn của CTAS để tự tay thiết kế kiến trúc bảng từ con số 0.
-
Làm chủ nhóm lệnh DDL (Data Definition Language) để định nghĩa và thay đổi bộ khung dữ liệu.
-
Nắm vững các thao tác tiến hóa schema (Schema Evolution) bằng
ALTER TABLEkhi nghiệp vụ kinh doanh thay đổi. -
Phân biệt rõ ràng sự khác biệt "sống còn" giữa việc xóa Metadata và xóa Dữ liệu vật lý khi dùng lệnh
DROP TABLE.
1. CREATE TABLE: Đặt nền móng kiến trúc
Ở Bài 41, CTAS giúp tạo bảng nhanh nhưng lại phụ thuộc vào dữ liệu đầu vào. Trong thực tế, các Data Engineer thường phải thiết kế sẵn "bộ khung" bảng trước khi hệ thống Streaming (như Kafka) bắt đầu bơm dữ liệu vào. Lúc này, bạn phải dùng CREATE TABLE tiêu chuẩn.
Cú pháp tổng quát:
SQL
CREATE TABLE [IF NOT EXISTS] catalog.schema.table_name (
column_name_1 data_type,
column_name_2 data_type,
...
)
[WITH ( property_name = expression, ... )];
Ví dụ thực tế: Tạo bảng lưu trữ thông tin người dùng với các thuộc tính vật lý của Data Lake (Apache Iceberg).
SQL
CREATE TABLE IF NOT EXISTS iceberg.core.users (
user_id BIGINT,
username VARCHAR,
email VARCHAR,
age INTEGER,
is_active BOOLEAN,
created_at TIMESTAMP(6)
)
WITH (
format = 'PARQUET', -- Định dạng file vật lý
partitioning = ARRAY['day(created_at)'] -- Phân vùng dữ liệu theo ngày
);
Góc nhìn Kỹ sư - Sự vắng mặt của Ràng buộc (Constraints): Nhắc lại từ bài trước, Trino không thực thi các ràng buộc như PRIMARY KEY, FOREIGN KEY, UNIQUE hay NOT NULL cho các hệ thống Data Lake (Iceberg, Hive). Nếu bạn cố tình gõ user_id BIGINT PRIMARY KEY, Trino sẽ báo lỗi cú pháp. Trách nhiệm đảm bảo chất lượng dữ liệu nằm ở khâu ETL/ELT trước khi đổ vào bảng.
2. ALTER TABLE: Tiến hóa cấu trúc (Schema Evolution)
Nghiệp vụ (Business) luôn thay đổi. Hôm nay bảng users chỉ cần email, ngày mai bộ phận Marketing đòi thêm cột phone_number. Bạn không thể xóa bảng đi tạo lại (vì dữ liệu cũ sẽ mất), đây là lúc ALTER TABLE ra tay.
Lưu ý: Khả năng hỗ trợ của ALTER TABLE phụ thuộc hoàn toàn vào Connector. Apache Iceberg hoặc Delta Lake hỗ trợ "Tiến hóa Schema" cực tốt, trong khi Hive Connector phiên bản cũ có thể bị hạn chế.
A. Thêm cột mới (Add Column):
SQL
-- Thêm cột số điện thoại, mặc định các dòng dữ liệu cũ (đã tồn tại) sẽ nhận giá trị NULL ở cột này
ALTER TABLE iceberg.core.users
ADD COLUMN phone_number VARCHAR;
B. Đổi tên cột (Rename Column):
SQL
-- Chuẩn hóa lại tên cột cho dễ hiểu
ALTER TABLE iceberg.core.users
RENAME COLUMN age TO user_age;
C. Đổi kiểu dữ liệu (Set Data Type / Alter Column): Rất rủi ro và chỉ được phép nới rộng kiểu (ví dụ từ INTEGER lên BIGINT), không được thu hẹp (từ VARCHAR về INTEGER) để tránh mất mát dữ liệu.
SQL
ALTER TABLE iceberg.core.users
ALTER COLUMN user_age SET DATA TYPE BIGINT;
D. Xóa cột (Drop Column):
SQL
ALTER TABLE iceberg.core.users
DROP COLUMN is_active;
(Cơ chế đằng sau: Trên Iceberg, thao tác này diễn ra trong chớp mắt vì Trino chỉ cập nhật lại Metadata file (Sổ cái), báo rằng cột này không còn tồn tại nữa. Các file Parquet vật lý chứa dữ liệu cũ dưới ổ cứng không hề bị đụng tới hay viết lại).
E. Đổi tên bảng (Rename Table):
SQL
ALTER TABLE iceberg.core.users
RENAME TO iceberg.core.active_users;
3. DROP TABLE: Sự hủy diệt và Cạm bẫy "Xóa Vật Lý vs Xóa Logic"
Lệnh gỡ bỏ một bảng ra khỏi hệ thống vô cùng đơn giản:
SQL
DROP TABLE IF EXISTS iceberg.core.active_users;
Tuy nhiên, ĐÂY LÀ KHÁI NIỆM QUAN TRỌNG NHẤT BẠN PHẢI BIẾT VỀ DATA LAKE:
Khi Trino ra lệnh DROP TABLE, chuyện gì xảy ra với dữ liệu (các file Parquet) nằm dưới Amazon S3 hoặc HDFS? Câu trả lời chia làm 2 trường hợp:
-
Trường hợp 1: Managed Table (Bảng nội bộ / Bảng quản lý)
-
Nếu bảng được tạo ra thông qua Trino (bằng lệnh
CREATE TABLEhoặcCTASnhư ở trên) mà không chỉ định đường dẫn lưu trữ thủ công, nó thường là Managed Table. -
Khi chạy
DROP TABLE, Trino sẽ xóa MetaData (sổ cái), ĐỒNG THỜI XÓA VĨNH VIỄN toàn bộ file vật lý (Dữ liệu gốc) trên ổ cứng. Không thể khôi phục (trừ khi có tính năng Time Travel của Iceberg).
-
-
Trường hợp 2: External Table (Bảng ngoại vi)
-
Nếu bạn tạo bảng và dùng thuộc tính
external_location = 's3://my-bucket/data/'để trỏ vào một thư mục dữ liệu đã có sẵn từ trước. -
Khi chạy
DROP TABLE, Trino CHỈ XÓA METADATA. Trino quên đi sự tồn tại của bảng này, nhưng các file Parquet dưới S3 vẫn còn nguyên vẹn. Đây là cơ chế bảo vệ an toàn dữ liệu (Xóa Logic). Hệ thống khác (như Spark) vẫn có thể đọc thư mục S3 đó bình thường.
-
4. Tóm tắt luồng quản trị (DDL Lifecycle)
-
Khởi tạo: Dùng
CREATE TABLEkết hợp Partitioning cho các bảng cấu trúc chuẩn, hoặcCTAScho báo cáo nhanh. -
Vận hành: Dùng
ALTER TABLEđể điều chỉnh khi nghiệp vụ yêu cầu thêm trường thông tin. -
Phân quyền (sắp học): Chỉ cho phép Data Engineer quyền DDL (
CREATE/ALTER/DROP), Data Analyst chỉ nên có quyềnSELECTđể tránh "lỡ tay" xóa nhầm bảng. -
Gỡ bỏ: Luôn kiểm tra kỹ tính chất Managed hay External trước khi
DROP.
All rights reserved