CREATE TABLE trong Databricks: Hướng dẫn đầy đủ về xây dựng và quản lý bảng
Khám phá cách tạo bảng trong Databricks bằng lệnh CREATE TABLE. Tìm hiểu các phương pháp cho từng kịch bản, bao gồm cách tạo bảng từ dữ liệu hiện có và cách CREATE TABLE AS SELECT.
Các bảng Databricks là thành phần cốt lõi của nền tảng Databricks Lakehouse, được thiết kế để xử lý lưu trữ và xử lý dữ liệu quy mô lớn. Những bảng này cho phép cộng tác giữa các nhóm bằng cách hợp nhất dữ liệu có cấu trúc và phi cấu trúc, đồng thời hỗ trợ các tác vụ phân tích.
Trong bài viết này, tôi sẽ hướng dẫn bạn các kỹ thuật khác nhau để tạo bảng trong Databricks bằng lệnh CREATE TABLE với một số biến thể cú pháp nhằm đáp ứng các trường hợp sử dụng khác nhau. Tôi cũng sẽ đưa ra một số mẹo về thực tiễn tốt nhất khi xây dựng và quản lý bảng trong Databricks để đạt hiệu quả và độ tin cậy cao.
Khi bắt đầu, tôi rất khuyến nghị bạn xem bài viết blog Cách học Databricks: Hướng dẫn cho người mới bắt đầu về Nền tảng Dữ liệu Hợp nhất của DataCamp để hiểu các tính năng cốt lõi và ứng dụng của Databricks, đồng thời cung cấp lộ trình có cấu trúc để bạn bắt đầu học. Tôi cũng khuyến nghị học khóa Introduction to Databricks của chúng tôi. Ngay cả khi bạn đã có kinh nghiệm với SQL, bạn sẽ thấy mọi thứ có thể trông khác trên nền tảng Databricks Lakehouse. Các bài tập tương tác trong khóa học sẽ hướng dẫn bạn qua các truy vấn SQL cũng như các tính năng của nền tảng và kết nối tới hệ thống bên ngoài.
Giới thiệu về bảng Databricks
Trước hết, cần nói rằng bảng Databricks là các tập dữ liệu có cấu trúc giúp tổ chức và truy cập dữ liệu trong môi trường Databricks Lakehouse. Có hai loại:
Managed Tables: Các bảng này được Databricks quản lý toàn diện, bao gồm cả lưu trữ và metadata. Khi tạo một bảng managed, Databricks sẽ xử lý các tệp dữ liệu bên dưới, và nếu bảng bị xóa, dữ liệu tương ứng cũng bị xóa.
External Tables: Các bảng external tham chiếu dữ liệu nằm ngoài Databricks, thường là trong các hệ thống lưu trữ đám mây như AWS S3 hoặc Azure Blob Storage. Databricks quản lý metadata cho các bảng này, nhưng dữ liệu thực tế vẫn giữ nguyên ngay cả khi bảng bị drop. Chúng còn được gọi là bảng unmanaged.
Các bảng trong Databricks thường mặc định là Delta Lake nhờ các tính năng nâng cao và tối ưu hóa của nó. Delta Lake cung cấp giao dịch ACID, khả năng mở rộng, cải thiện hiệu năng như tối ưu hóa cache và indexing, và xử lý dữ liệu batch và streaming hợp nhất.
Lưu ý, những phiên bản đầu của Azure Databricks dùng các bảng “định dạng Hive” cũ, nay đã được thay thế bởi bảng Delta hiện đại. Nhìn chung, các bảng Delta hiện đại vượt trội so với bảng Hive cũ về độ tin cậy và hiệu năng, khiến chúng trở thành lựa chọn mặc định cho các quy trình Databricks.
Dưới đây là phần tóm tắt mà tôi nghĩ sẽ giúp bạn thấy sự khác biệt giữa hai loại:
Tính năng
Bảng định dạng Hive
Bảng Delta
Định dạng dữ liệu
Apache Hive (CSV, Parquet, ORC, v.v.)
Delta Lake (dựa trên Parquet kèm metadata)
Giao dịch
Không hỗ trợ ACID (nhất quán dần)
Giao dịch ACID đầy đủ
Quản lý schema
Ràng buộc hạn chế
Ràng buộc schema nghiêm ngặt
Tối ưu hiệu năng
Cần tinh chỉnh thủ công
Tối ưu tích hợp sẵn (caching, compaction)
Time travel
Không hỗ trợ truy vấn lịch sử tích hợp
Hỗ trợ time travel để truy vấn phiên bản dữ liệu trước đó
Truy cập đồng thời
Dễ xung đột khi cập nhật hoặc xóa
Xử lý hiệu quả các thao tác đồng thời
Các biến thể cú pháp CREATE TABLE
Lệnh CREATE TABLE trong Databricks hỗ trợ nhiều biến thể để đáp ứng các trường hợp khác nhau. Mỗi biến thể có mục đích riêng, với các tùy chọn nhắm mục tiêu như vị trí tệp, cloning và quản lý metadata. Nếu bạn cần ôn lại kiến thức về Databricks SQL, tôi khuyến nghị đọc hướng dẫn Databricks SQL của chúng tôi để học, trong số những nội dung khác, cách sử dụng Notebook trong một Databricks SQL warehouse.
Dưới đây là các kiểu cú pháp chính kèm ví dụ và giải thích.
CREATE TABLE [USING]
Cú pháp này tạo một bảng mới với schema và định dạng dữ liệu xác định. Truy vấn sau tạo một bảng tên sales_data bằng cách đọc dữ liệu từ các tệp Parquet được lưu ở một vị trí cụ thể.
-- Create a table from files in a specific formatCREATETABLE sales_data
USING PARQUET
LOCATION '/mnt/data/sales';Được hỗ trợ bởi
CREATE TABLE (định dạng Hive)
Cú pháp cũ này tương tự lệnh SQL chuẩn CREATE TABLE, dùng khi định nghĩa một bảng với metadata do Databricks quản lý mà không cần tham chiếu tệp external. Truy vấn dưới đây tạo một bảng kiểu Hive tên hive_table với schema xác định trước và các thuộc tính metadata bổ sung.
-- Hive-style table creation with schema definitionCREATETABLE hive_table (
id INT,
name STRING
)COMMENT'Hive format example'
TBLPROPERTIES ('created_by'='databricks');Được hỗ trợ bởi
Trong truy vấn trên, mệnh đề COMMENT thêm metadata mô tả, còn TBLPROPERTIES lưu các thuộc tính tùy chỉnh về bảng.
CREATE TABLE LIKE
Lệnh này tạo một bảng mới sử dụng schema và thuộc tính của một bảng hiện có. Bạn nên dùng cú pháp này khi muốn sao chép cấu trúc của một bảng mà không sao chép dữ liệu. Điều này hữu ích cho mục đích thử nghiệm hoặc phát triển.
-- Create a table with the same schema as another tableCREATETABLE new_table LIKE existing_table;Được hỗ trợ bởi
CREATE TABLE CLONE
Cú pháp này cho phép bạn tạo một bảng mới bằng cách clone một bảng Delta Lake hiện có, dưới dạng deep hoặc shallow clone. Vì vậy, bạn nên dùng CREATE TABLE CLONE khi cần một bản sao độc lập dữ liệu và metadata (deep clone) hoặc chỉ metadata trong khi tham chiếu dữ liệu gốc (shallow clone). Hãy nghĩ đến trường hợp versioning hoặc tạo bản sao lưu.
Ví dụ sau minh họa các truy vấn tạo deep clone và shallow clone trong Databricks.
-- Deep clone by defaultCREATETABLE cloned_table CLONE original_table;-- Shallow cloneCREATETABLE shallow_clone_table SHALLOW CLONE original_table;Được hỗ trợ bởi
CREATE OR REPLACE TABLE
Lệnh kết hợp này thay thế một bảng hiện có bằng một bảng mới, giữ nguyên tên bảng, trong một thao tác. Bạn nên dùng cú pháp này khi muốn ghi đè hoàn toàn một bảng hiện có nhưng vẫn giữ tên. Điều này đặc biệt hữu ích để cập nhật cấu trúc hoặc dữ liệu của bảng mà không cần drop trước.
Truy vấn ví dụ dưới đây tạo hoặc thay thế bảng sales với schema mới.
-- Create or replace a sales table with a new schemaCREATEORREPLACETABLE sales (
sale_id INT,
amount FLOAT)USING DELTA
LOCATION '/mnt/delta/sales';Được hỗ trợ bởi
Có các mệnh đề liên quan khác bạn có thể dùng cùng cú pháp CREATE TABLE trong Databricks để quản lý bảng theo yêu cầu cụ thể. Sau đây là tóm tắt cách dùng cho từng mệnh đề. Tôi đã dùng một số nhưng không phải tất cả trong các ví dụ ở trên.
IF NOT EXISTS: Tránh lỗi bằng cách bỏ qua việc tạo bảng nếu bảng đã tồn tại.
USING: Chỉ định định dạng tệp (ví dụ: Delta, Parquet, CSV).
EXTERNAL: Khai báo bảng có dữ liệu nằm ngoài lưu trữ do Databricks quản lý.
PARTITIONED BY: Định nghĩa các phân vùng để tối ưu cho tập dữ liệu lớn.
LOCATION: Trỏ đến thư mục chứa dữ liệu của bảng.
TBLPROPERTIES: Thêm metadata cho cấu hình và tối ưu tùy chỉnh của bảng.
Minh họa từng bước
Trong phần này, tôi sẽ minh họa các cách khác nhau để tạo và quản lý bảng trong Databricks, với ví dụ ngắn gọn và giải thích các mệnh đề chính. Tôi khuyến nghị xem hướng dẫn Databricks Tutorial: 7 khái niệm cần biết cho mọi chuyên gia dữ liệu để học cách chạy lệnh SQL trên nền tảng Databricks.
Cách tạo một bảng rỗng
Để tạo một bảng Delta rỗng, hãy định nghĩa schema của bảng với tên cột và kiểu dữ liệu. Dùng mệnh đề USING DELTA để xác định định dạng bảng và COMMENT để thêm metadata mô tả.
Truy vấn này tạo một bảng Delta rỗng tên employees với schema xác định trước, gồm các cột id, name, department và hire_date.
-- Create an empty Delta table with a defined schemaCREATETABLE employees (
id BIGINT,
name STRING,
department STRING,
hire_date DATE)USING DELTA
COMMENT'Table to store employee information';Được hỗ trợ bởi
Cách tạo bảng từ dữ liệu hiện có
Để tạo bảng từ dữ liệu hiện có, liên kết bảng tới các tệp dữ liệu external theo định dạng như CSV, Parquet hoặc JSON. Bạn có thể dùng mệnh đề LOCATION để liên kết bảng với đường dẫn tệp và mệnh đề USING để chỉ định định dạng dữ liệu.
Ví dụ, truy vấn sau tạo một bảng tên sales_data bằng cách tham chiếu các tệp Parquet được lưu tại /mnt/data/sales_data/.
-- Create a table from Parquet files in a specified locationCREATETABLE sales_data
USING PARQUET
LOCATION '/mnt/data/sales_data/';Được hỗ trợ bởi
Cách tạo bảng dưới dạng truy vấn chọn (CTAS)
Bạn cũng có thể tạo bảng dưới dạng chọn bằng cách thực thi một truy vấn và lưu kết quả. Trong kịch bản này, mệnh đề AS SELECT sẽ nạp dữ liệu cho bảng từ kết quả truy vấn.
Ví dụ, truy vấn dưới đây tạo một bảng mới tên high_value_sales bằng cách chọn và biến đổi dữ liệu từ bảng sales_data hiện có. Truy vấn lọc các hàng có total_amount lớn hơn 1000, chỉ giữ các cột sale_id, customer_id và total_amount.
-- Create a table by selecting and transforming data from another tableCREATETABLE high_value_sales ASSELECT
sale_id,
customer_id,
total_amount
FROM sales_data
WHERE total_amount >1000;Được hỗ trợ bởi
Cách tạo bảng external
Tạo một bảng external liên quan đến việc tham chiếu dữ liệu được lưu trữ bên ngoài vùng lưu trữ do Databricks quản lý. Bạn nên dùng mệnh đề LOCATION để chỉ định vị trí dữ liệu external.
Truy vấn dưới đây tạo một bảng Delta external tên external_table bằng cách tham chiếu dữ liệu lưu tại /mnt/external_storage/external_table/.
-- Create an external table referencing data outside Databricks storageCREATETABLE external_table
USING DELTA
LOCATION '/mnt/external_storage/external_table/';Được hỗ trợ bởi
Cách tạo bảng LIKE
Để tạo bảng LIKE, hãy nhân bản schema của một bảng hiện có mà không sao chép dữ liệu. Trong ví dụ dưới đây, truy vấn tạo một bảng mới tên sales_backup với cùng schema như bảng sales hiện có.
-- Create a new sales table with the same schema as an existing tableCREATETABLE sales_backup LIKE sales;Được hỗ trợ bởi
Cách tạo TABLE CLONE
Bạn có thể tạo một bản sao bảng bằng cách dùng mệnh đề CLONE để tạo bản sao shallow hoặc deep của một bảng Delta nhằm phục vụ sao lưu hoặc thử nghiệm.
Trong ví dụ sau, truy vấn tạo một bảng mới sales_shallow_clone, chỉ sao chép metadata (schema và thuộc tính bảng).
-- Shallow clone: Copies only metadata (references original data)CREATETABLE sales_shallow_clone CLONE sales_data;Được hỗ trợ bởi
Ví dụ dưới đây tạo một bảng mới sales_deep_clone, nhưng sao chép cả metadata và dữ liệu thực tế.
-- Deep clone: Copies both metadata and actual dataCREATETABLE sales_deep_clone CLONE sales_data DEEP;Được hỗ trợ bởi
Cách tạo bảng tạm (temp table)
Sử dụng mệnh đề TEMPORARY khi tạo bảng tạm để đảm bảo bảng chỉ tồn tại trong phiên làm việc.
Truy vấn dưới đây tạo một bảng tạm tên temp_table chỉ tồn tại trong phiên hiện tại. Nó chọn id, name và sales_amount từ sales_data, lọc những hàng có region = 'US'.
-- Create a temporary table that exists only in the sessionCREATETEMPORARYTABLE temp_table ASSELECT
id,
name,
sales_amount
FROM sales_data
WHERE region ='US';Được hỗ trợ bởi
Cách thay thế một bảng
Bạn có thể dùng mệnh đề CREATE OR REPLACE để thay thế định nghĩa và nội dung của bảng. Truy vấn dưới đây thay thế bảng updated_table hiện có bằng schema và dữ liệu mới. Nó định nghĩa bảng với ba cột (id, name, total_sales).
-- Replace an existing table with a new schema or dataCREATEORREPLACETABLE updated_table (
id BIGINT,
name STRING,
total_sales DOUBLE)USING DELTA
LOCATION '/mnt/delta/updated_table/';Được hỗ trợ bởi
Chủ đề nâng cao
Trong phần này, tôi sẽ khám phá các tính năng bảng Databricks nâng cao giúp tăng cường chức năng, hiệu năng và bảo mật.
Cột sinh tự động và cột identity
Databricks hỗ trợ các cột identity, tự động tạo giá trị duy nhất cho mỗi hàng mới. Tính năng này hữu ích để tạo khóa thay thế trong kho dữ liệu.
Truy vấn dưới đây tạo bảng employees với ba cột: id, name và department. Cột id là cột identity tự tăng với mỗi hàng mới.
-- Identity column: auto-incremented valueCREATETABLE employees (
id BIGINT GENERATED ALWAYS ASIDENTITY,-- Auto-incremented column
name STRING,
department STRING
);Được hỗ trợ bởi
Truy vấn khác này tạo bảng sales với ba cột: sale_id, sale_date và sale_year. Cột sale_year là cột sinh tự động và được tính dựa trên cột sale_date bằng hàm YEAR(sale_date).
-- Generated column: derived from other columnsCREATETABLE sales (
sale_id BIGINT,
sale_date DATE,
sale_year INT GENERATED ALWAYS AS(YEAR(sale_date))-- Derived column);Được hỗ trợ bởi
Partitioning và clustering
Partitioning chia dữ liệu thành các phần nhỏ hơn, cải thiện hiệu năng truy vấn, trong khi clustering tổ chức dữ liệu trong từng phân vùng để đọc nhanh hơn.
Ví dụ, truy vấn dưới đây tạo một bảng được phân vùng, trong đó dữ liệu được chia theo cột region, giúp cải thiện hiệu năng truy vấn khi lọc theo vùng.
-- Partitioned tableCREATETABLE partitioned_table (
id BIGINT,
region STRING,
sales_amount DOUBLE)USING DELTA
PARTITIONED BY(region);-- Querying by region will be fasterĐược hỗ trợ bởi
Truy vấn dưới đây tối ưu bảng đã phân vùng bằng cách clustering dữ liệu trong mỗi phân vùng dựa trên cột sales_amount. Nó giúp các truy vấn trên sales_amount nhanh hơn bằng cách cải thiện bố cục dữ liệu để đọc hiệu quả. Mệnh đề ZORDER BY hoạt động trong phạm vi từng phân vùng để cải thiện hiệu năng đọc bằng cách gom cụm dữ liệu trong phân vùng, không phải giữa các phân vùng.
-- Clustered tableOPTIMIZE partitioned_table
ZORDER BY(sales_amount);-- Clusters data within partitions for efficient readsĐược hỗ trợ bởi
Che giấu cột và lọc theo hàng
Che giấu cột và bộ lọc theo hàng hạn chế khả năng hiển thị dữ liệu dựa trên vai trò người dùng hoặc điều kiện, bảo vệ thông tin nhạy cảm.
Ví dụ, truy vấn dưới đây tạo một masked view tên masked_table dựa trên bảng employees. Cột salary được làm mờ (thay bằng REDACTED) cho tất cả người dùng ngoại trừ những người có vai trò manager. Mệnh đề CASE đảm bảo chỉ quản lý mới nhìn thấy mức lương thực tế, còn người khác thấy dữ liệu đã che giấu
-- Column masking: Redact sensitive dataCREATE MASKED VIEW masked_table ASSELECT
id,
name,CASEWHENcurrent_user()='manager'THEN salary
ELSE'REDACTED'ENDAS salary
FROM employees;Được hỗ trợ bởi
Tương tự, truy vấn dưới đây dùng bộ lọc theo hàng để tạo hoặc thay thế một view tên filtered_table dựa trên bảng sales. View này lọc các hàng chỉ bao gồm dữ liệu nơi region = 'US', giới hạn truy cập chỉ còn dữ liệu bán hàng tại Mỹ.
-- Row filters: Fine-grained access controlCREATEORREPLACEVIEW filtered_table ASSELECT*FROM sales
WHERE region ='US';-- Limit data visibility to a specific regionĐược hỗ trợ bởi
Tiến hóa schema
Databricks hỗ trợ tiến hóa schema thông qua CREATE OR REPLACE TABLE và các thay đổi bảng. Bạn nên dùng câu lệnh CREATE OR REPLACE TABLE để ghi đè schema và dữ liệu, và ALTER TABLE để chỉnh sửa schema dần dần mà không ảnh hưởng dữ liệu.
Truy vấn dưới đây thay thế bảng employees hiện có bằng schema mới, thêm cột hire_date mới trong khi vẫn lưu dữ liệu ở định dạng Delta.
-- Schema evolution with CREATE OR REPLACE TABLECREATEORREPLACETABLE employees (
id BIGINT,
name STRING,
department STRING,
hire_date DATE-- New column added)USING DELTA;Được hỗ trợ bởi
Truy vấn khác này chỉnh sửa bảng employees bằng cách thêm cột salary mới vào schema hiện có.
-- Altering a table schemaALTERTABLE employees ADDCOLUMNS(salary DOUBLE);Được hỗ trợ bởi
Tinh chỉnh hiệu năng
Để tối ưu hiệu năng cho các bảng quy mô lớn, bạn có thể tận dụng nhiều thuộc tính bảng và kỹ thuật như tự động tối ưu và Z-ordering.
Trong ví dụ sau, truy vấn bật tự động tối ưu trên delta_table bằng cách thiết lập các thuộc tính để tự động nén file nhỏ và gộp file trong quá trình ghi, cải thiện hiệu quả lưu trữ.
-- Enable automatic optimizationsALTERTABLE delta_table
SET TBLPROPERTIES ('delta.autoOptimize.optimizeWrite'='true',-- Automatically compact small files'delta.autoOptimize.autoCompact'='true'-- Automatically merge files);Được hỗ trợ bởi
Tương tự, truy vấn dưới đây tối ưu delta_table bằng cách gom cụm dữ liệu dựa trên region và sales_date để tăng hiệu năng truy vấn, đặc biệt cho các bộ lọc trên các cột này.
-- Perform clustering for faster query performanceOPTIMIZE delta_table
ZORDER BY(region, sales_date);-- Improves query efficiency for frequent filtersĐược hỗ trợ bởi
Thực tiễn tốt và lưu ý
Dưới đây là một số điều cần cân nhắc khi tạo bảng trong Databricks để bạn làm đúng ngay từ đầu:
Quy ước đặt tên bảng: Luôn dùng tên rõ ràng và nhất quán để tăng khả năng tìm kiếm và giảm lỗi. Tránh ký tự đặc biệt hoặc tên quá dài để ngăn vấn đề tương thích.
Bảo mật và phân quyền: Sử dụng Unity Catalog để kiểm soát truy cập tập trung cho mọi tài sản dữ liệu. Dùng Access Control Lists (ACL) để giới hạn ai có thể xem hoặc chỉnh sửa dữ liệu. Đồng thời, che giấu dữ liệu nhạy cảm bằng masking theo cột hoặc lọc theo hàng.
Sao lưu và khôi phục: Tận dụng lịch sử phiên bản của Delta Lake để khôi phục dễ dàng và time travel. Thường xuyên theo dõi và quản lý thời hạn lưu trữ các phiên bản lịch sử để cân bằng chi phí và nhu cầu khôi phục.
Managed so với external tables: Cũng rất quan trọng để hiểu bảng managed và bảng external. Với bảng managed, Databricks xử lý cả metadata và dữ liệu. Điều này lý tưởng khi bạn muốn kiểm soát toàn bộ vòng đời dữ liệu. Tuy nhiên, với bảng external, dữ liệu tham chiếu được lưu bên ngoài Databricks. Điều này hữu ích để duy trì quyền kiểm soát dữ liệu có thể được chia sẻ trên các nền tảng hoặc hệ thống khác nhau.
Lỗi thường gặp và cách khắc phục
Sau khi đã thảo luận về thực tiễn tốt nhất để quản lý bảng trong Databricks, tôi sẽ đề cập đến các vấn đề thường gặp với bảng Databricks, thông báo lỗi tiêu biểu và cách giải quyết.
Lỗi vị trí không rỗng khi dùng CREATE so với CREATE OR REPLACE
Khi dùng CREATE TABLE với vị trí xác định (mệnh đề LOCATION), nếu thư mục không rỗng, bạn có thể gặp lỗi như:
Error: Cannot createtable because the location isnot empty.Được hỗ trợ bởi
Lỗi này xảy ra vì lệnh CREATE TABLE yêu cầu thư mục trống cho vị trí đã chỉ định, nhưng các tệp hoặc metadata hiện có xung đột với yêu cầu này.
Để khắc phục, hãy dùng câu lệnh CREATE OR REPLACE TABLE để ghi đè dữ liệu và metadata hiện có. Hoặc tự dọn thư mục trước khi dùng CREATE TABLE.
CREATEORREPLACETABLE delta_table
USING DELTA
LOCATION '/mnt/data/delta_table';-- Overwrites table and filesĐược hỗ trợ bởi
Không khớp schema hoặc vấn đề với một số kiểu dữ liệu
Việc chèn hoặc truy vấn dữ liệu dẫn đến lỗi không khớp schema như:
Error: Schema mismatch: Expected columntype STRING, but found INT.Được hỗ trợ bởi
Lỗi có thể do không khớp giữa schema của bảng và kiểu dữ liệu đầu vào. Ngoài ra, các chuyển đổi kiểu dữ liệu không được hỗ trợ hoặc mơ hồ (ví dụ: kiểu lồng phức tạp) cũng có thể gây không khớp schema. Để khắc phục, hãy bắt buộc khớp schema bằng cách xác minh schema khi tạo bảng hoặc sử dụng ràng buộc schema trong các bảng Delta.
-- Enforce schema matching during table creationCREATETABLE schema_table (
id INT,
name STRING
)USING DELTA
TBLPROPERTIES ('delta.schema.enforce'='true');-- Enforces strict schemaĐược hỗ trợ bởi
Bên cạnh đó, bạn nên cho phép tiến hóa schema khi thêm cột mới hoặc thay đổi kiểu dữ liệu.
ALTERTABLE schema_table ADDCOLUMNS(new_column DOUBLE);Được hỗ trợ bởi
Sử dụng ép kiểu tường minh khi chèn dữ liệu cũng sẽ giúp xử lý loại lỗi này.
INSERTINTO schema_table SELECT CAST(id ASINT), CAST(name AS STRING)FROM source_table;Được hỗ trợ bởi
Giới hạn giao dịch đồng thời với cột identity
Khi sử dụng cột identity, bạn có thể gặp vấn đề liên quan đến giao dịch đồng thời, chẳng hạn như:
Error: Concurrent transactions detected onidentitycolumntableĐược hỗ trợ bởi
Các cột identity có trạng thái và có thể gặp xung đột khi nhiều giao dịch đồng thời cố gắng chèn dữ liệu. Để khắc phục, hãy dùng khóa thay thế để thay cột identity bằng các khóa thay thế có tính quyết định, được tạo bằng các hàm như uuid() hoặc monotonically_increasing_id().
CREATETABLE better_table ASSELECT
monotonically_increasing_id()AS id,-- Replaces identity column
name, department
FROM source_data;Được hỗ trợ bởi
Bạn cũng có thể dùng MERGE của Delta Lake cho các quy trình chèn và cập nhật phức tạp mà không cần dựa vào cột identity.
MERGEINTO target_table AS t
USING source_table AS s
ON t.id = s.id
WHENMATCHEDTHENUPDATESET*WHENNOTMATCHEDTHENINSERT*;Được hỗ trợ bởi
Kết luận
Trong Databricks, lệnh CREATE TABLE là công cụ linh hoạt để định nghĩa cấu trúc dữ liệu, liên kết tới dữ liệu external và tạo ra tập dữ liệu mới thông qua truy vấn. Việc hiểu các cú pháp khác nhau để tạo và quản lý bảng trong Databricks theo nhu cầu cụ thể của bạn là rất quan trọng. Như bạn đã thấy, có một vài phương pháp tạo bảng để lựa chọn.
Nếu bạn muốn khám phá các khái niệm nền tảng của Databricks, tôi rất khuyến nghị học khóa Introduction to Databricks của DataCamp để tìm hiểu về Databricks như một giải pháp kho dữ liệu cho Business Intelligence (BI). Tôi cũng khuyến nghị xem bài viết Chứng chỉ Databricks năm 2025 của chúng tôi để biết cách đạt được chứng chỉ Databricks, khám phá lợi ích nghề nghiệp, và lựa chọn chứng chỉ phù hợp với mục tiêu của bạn.
Biên tập viên kỹ thuật về Khoa học dữ liệu với kinh nghiệm thực tế trong phân tích dữ liệu, trí tuệ doanh nghiệp và khoa học dữ liệu. Tôi viết nội dung thực tiễn, tập trung vào ngành về SQL, Python, Power BI, Databricks và kỹ thuật dữ liệu, dựa trên công việc phân tích trong thế giới thực. Bài viết của tôi kết nối chiều sâu kỹ thuật với tác động kinh doanh, giúp các chuyên gia chuyển đổi dữ liệu thành những quyết định vững chắc.
Câu hỏi thường gặp về Databricks CREATE TABLE
Mục đích của lệnh CREATE TABLE trong Databricks là gì?⌄
Lệnh CREATE TABLE được dùng để định nghĩa một bảng mới trong Databricks, cho phép người dùng chỉ định schema của bảng, định dạng dữ liệu và vị trí lưu trữ.
Sự khác nhau giữa bảng managed và bảng external là gì?⌄
Bảng managed lưu cả metadata và dữ liệu trong Databricks, trong khi bảng external chỉ lưu metadata, còn dữ liệu nằm ở vị trí external.
Bảng external có giống bảng unmanaged không? ⌄
Đúng vậy, bảng external và bảng unmanaged đề cập đến cùng một khái niệm trong Databricks. Chúng lưu metadata trong Databricks nhưng giữ dữ liệu thực tế ở vị trí external, cho phép bạn quản lý vòng đời dữ liệu độc lập.
Shallow clone và deep clone khác nhau thế nào?⌄
Shallow clone chỉ sao chép metadata, trong khi deep clone sao chép cả dữ liệu và metadata.
Bảng tạm (temporary tables) là gì?⌄
Bảng tạm (temporary) chỉ tồn tại trong phiên làm việc hiện tại và sẽ tự động bị xóa sau khi phiên kết thúc.
Tiến hóa schema (schema evolution) trong Databricks là gì?⌄
Tiến hóa schema cho phép bạn chỉnh sửa schema của bảng hiện có (ví dụ: thêm hoặc sửa cột) mà không cần tạo lại toàn bộ bảng, đặc biệt hữu ích với các bảng Delta.
Các bảng Databricks là thành phần cốt lõi của nền tảng Databricks Lakehouse, được thiết kế để xử lý lưu trữ và xử lý dữ liệu quy mô lớn. Những bảng này cho phép cộng tác giữa các nhóm bằng cách hợp nhất dữ liệu có cấu trúc và phi cấu trúc, đồng thời hỗ trợ các tác vụ phân tích.
Trong bài viết này, tôi sẽ hướng dẫn bạn các kỹ thuật khác nhau để tạo bảng trong Databricks bằng lệnh
CREATE TABLEvới một số biến thể cú pháp nhằm đáp ứng các trường hợp sử dụng khác nhau. Tôi cũng sẽ đưa ra một số mẹo về thực tiễn tốt nhất khi xây dựng và quản lý bảng trong Databricks để đạt hiệu quả và độ tin cậy cao.Khi bắt đầu, tôi rất khuyến nghị bạn xem bài viết blog Cách học Databricks: Hướng dẫn cho người mới bắt đầu về Nền tảng Dữ liệu Hợp nhất của DataCamp để hiểu các tính năng cốt lõi và ứng dụng của Databricks, đồng thời cung cấp lộ trình có cấu trúc để bạn bắt đầu học. Tôi cũng khuyến nghị học khóa Introduction to Databricks của chúng tôi. Ngay cả khi bạn đã có kinh nghiệm với SQL, bạn sẽ thấy mọi thứ có thể trông khác trên nền tảng Databricks Lakehouse. Các bài tập tương tác trong khóa học sẽ hướng dẫn bạn qua các truy vấn SQL cũng như các tính năng của nền tảng và kết nối tới hệ thống bên ngoài.
Giới thiệu về bảng Databricks
Trước hết, cần nói rằng bảng Databricks là các tập dữ liệu có cấu trúc giúp tổ chức và truy cập dữ liệu trong môi trường Databricks Lakehouse. Có hai loại:
Các bảng trong Databricks thường mặc định là Delta Lake nhờ các tính năng nâng cao và tối ưu hóa của nó. Delta Lake cung cấp giao dịch ACID, khả năng mở rộng, cải thiện hiệu năng như tối ưu hóa cache và indexing, và xử lý dữ liệu batch và streaming hợp nhất.
Lưu ý, những phiên bản đầu của Azure Databricks dùng các bảng “định dạng Hive” cũ, nay đã được thay thế bởi bảng Delta hiện đại. Nhìn chung, các bảng Delta hiện đại vượt trội so với bảng Hive cũ về độ tin cậy và hiệu năng, khiến chúng trở thành lựa chọn mặc định cho các quy trình Databricks.
Dưới đây là phần tóm tắt mà tôi nghĩ sẽ giúp bạn thấy sự khác biệt giữa hai loại:
Các biến thể cú pháp CREATE TABLE
Lệnh
CREATE TABLEtrong Databricks hỗ trợ nhiều biến thể để đáp ứng các trường hợp khác nhau. Mỗi biến thể có mục đích riêng, với các tùy chọn nhắm mục tiêu như vị trí tệp, cloning và quản lý metadata. Nếu bạn cần ôn lại kiến thức về Databricks SQL, tôi khuyến nghị đọc hướng dẫn Databricks SQL của chúng tôi để học, trong số những nội dung khác, cách sử dụng Notebook trong một Databricks SQL warehouse.Dưới đây là các kiểu cú pháp chính kèm ví dụ và giải thích.
CREATE TABLE [USING]
Cú pháp này tạo một bảng mới với schema và định dạng dữ liệu xác định. Truy vấn sau tạo một bảng tên
sales_databằng cách đọc dữ liệu từ các tệp Parquet được lưu ở một vị trí cụ thể.CREATE TABLE (định dạng Hive)
Cú pháp cũ này tương tự lệnh SQL chuẩn
CREATE TABLE, dùng khi định nghĩa một bảng với metadata do Databricks quản lý mà không cần tham chiếu tệp external. Truy vấn dưới đây tạo một bảng kiểu Hive tênhive_tablevới schema xác định trước và các thuộc tính metadata bổ sung.Trong truy vấn trên, mệnh đề
COMMENTthêm metadata mô tả, cònTBLPROPERTIESlưu các thuộc tính tùy chỉnh về bảng.CREATE TABLE LIKE
Lệnh này tạo một bảng mới sử dụng schema và thuộc tính của một bảng hiện có. Bạn nên dùng cú pháp này khi muốn sao chép cấu trúc của một bảng mà không sao chép dữ liệu. Điều này hữu ích cho mục đích thử nghiệm hoặc phát triển.
CREATE TABLE CLONE
Cú pháp này cho phép bạn tạo một bảng mới bằng cách clone một bảng Delta Lake hiện có, dưới dạng deep hoặc shallow clone. Vì vậy, bạn nên dùng
CREATE TABLE CLONEkhi cần một bản sao độc lập dữ liệu và metadata (deep clone) hoặc chỉ metadata trong khi tham chiếu dữ liệu gốc (shallow clone). Hãy nghĩ đến trường hợp versioning hoặc tạo bản sao lưu.Ví dụ sau minh họa các truy vấn tạo deep clone và shallow clone trong Databricks.
CREATE OR REPLACE TABLE
Lệnh kết hợp này thay thế một bảng hiện có bằng một bảng mới, giữ nguyên tên bảng, trong một thao tác. Bạn nên dùng cú pháp này khi muốn ghi đè hoàn toàn một bảng hiện có nhưng vẫn giữ tên. Điều này đặc biệt hữu ích để cập nhật cấu trúc hoặc dữ liệu của bảng mà không cần drop trước.
Truy vấn ví dụ dưới đây tạo hoặc thay thế bảng
salesvới schema mới.Có các mệnh đề liên quan khác bạn có thể dùng cùng cú pháp
CREATE TABLEtrong Databricks để quản lý bảng theo yêu cầu cụ thể. Sau đây là tóm tắt cách dùng cho từng mệnh đề. Tôi đã dùng một số nhưng không phải tất cả trong các ví dụ ở trên.IF NOT EXISTS: Tránh lỗi bằng cách bỏ qua việc tạo bảng nếu bảng đã tồn tại.USING: Chỉ định định dạng tệp (ví dụ: Delta, Parquet, CSV).EXTERNAL: Khai báo bảng có dữ liệu nằm ngoài lưu trữ do Databricks quản lý.PARTITIONED BY: Định nghĩa các phân vùng để tối ưu cho tập dữ liệu lớn.LOCATION: Trỏ đến thư mục chứa dữ liệu của bảng.TBLPROPERTIES: Thêm metadata cho cấu hình và tối ưu tùy chỉnh của bảng.Minh họa từng bước
Trong phần này, tôi sẽ minh họa các cách khác nhau để tạo và quản lý bảng trong Databricks, với ví dụ ngắn gọn và giải thích các mệnh đề chính. Tôi khuyến nghị xem hướng dẫn Databricks Tutorial: 7 khái niệm cần biết cho mọi chuyên gia dữ liệu để học cách chạy lệnh SQL trên nền tảng Databricks.
Cách tạo một bảng rỗng
Để tạo một bảng Delta rỗng, hãy định nghĩa schema của bảng với tên cột và kiểu dữ liệu. Dùng mệnh đề
USING DELTAđể xác định định dạng bảng vàCOMMENTđể thêm metadata mô tả.Truy vấn này tạo một bảng Delta rỗng tên
employeesvới schema xác định trước, gồm các cộtid,name,departmentvàhire_date.Cách tạo bảng từ dữ liệu hiện có
Để tạo bảng từ dữ liệu hiện có, liên kết bảng tới các tệp dữ liệu external theo định dạng như CSV, Parquet hoặc JSON. Bạn có thể dùng mệnh đề
LOCATIONđể liên kết bảng với đường dẫn tệp và mệnh đềUSINGđể chỉ định định dạng dữ liệu.Ví dụ, truy vấn sau tạo một bảng tên
sales_databằng cách tham chiếu các tệp Parquet được lưu tại/mnt/data/sales_data/.Cách tạo bảng dưới dạng truy vấn chọn (CTAS)
Bạn cũng có thể tạo bảng dưới dạng chọn bằng cách thực thi một truy vấn và lưu kết quả. Trong kịch bản này, mệnh đề
AS SELECTsẽ nạp dữ liệu cho bảng từ kết quả truy vấn.Ví dụ, truy vấn dưới đây tạo một bảng mới tên
high_value_salesbằng cách chọn và biến đổi dữ liệu từ bảngsales_datahiện có. Truy vấn lọc các hàng cótotal_amountlớn hơn 1000, chỉ giữ các cộtsale_id,customer_idvàtotal_amount.Cách tạo bảng external
Tạo một bảng external liên quan đến việc tham chiếu dữ liệu được lưu trữ bên ngoài vùng lưu trữ do Databricks quản lý. Bạn nên dùng mệnh đề
LOCATIONđể chỉ định vị trí dữ liệu external.Truy vấn dưới đây tạo một bảng Delta external tên
external_tablebằng cách tham chiếu dữ liệu lưu tại/mnt/external_storage/external_table/.Cách tạo bảng LIKE
Để tạo bảng
LIKE, hãy nhân bản schema của một bảng hiện có mà không sao chép dữ liệu. Trong ví dụ dưới đây, truy vấn tạo một bảng mới tênsales_backupvới cùng schema như bảngsaleshiện có.Cách tạo TABLE CLONE
Bạn có thể tạo một bản sao bảng bằng cách dùng mệnh đề
CLONEđể tạo bản sao shallow hoặc deep của một bảng Delta nhằm phục vụ sao lưu hoặc thử nghiệm.Trong ví dụ sau, truy vấn tạo một bảng mới
sales_shallow_clone, chỉ sao chép metadata (schema và thuộc tính bảng).Ví dụ dưới đây tạo một bảng mới
sales_deep_clone, nhưng sao chép cả metadata và dữ liệu thực tế.Cách tạo bảng tạm (temp table)
Sử dụng mệnh đề
TEMPORARYkhi tạo bảng tạm để đảm bảo bảng chỉ tồn tại trong phiên làm việc.Truy vấn dưới đây tạo một bảng tạm tên
temp_tablechỉ tồn tại trong phiên hiện tại. Nó chọnid,namevàsales_amounttừsales_data, lọc những hàng córegion = 'US'.Cách thay thế một bảng
Bạn có thể dùng mệnh đề
CREATE OR REPLACEđể thay thế định nghĩa và nội dung của bảng. Truy vấn dưới đây thay thế bảngupdated_tablehiện có bằng schema và dữ liệu mới. Nó định nghĩa bảng với ba cột (id,name,total_sales).Chủ đề nâng cao
Trong phần này, tôi sẽ khám phá các tính năng bảng Databricks nâng cao giúp tăng cường chức năng, hiệu năng và bảo mật.
Cột sinh tự động và cột identity
Databricks hỗ trợ các cột identity, tự động tạo giá trị duy nhất cho mỗi hàng mới. Tính năng này hữu ích để tạo khóa thay thế trong kho dữ liệu.
Truy vấn dưới đây tạo bảng
employeesvới ba cột:id,namevàdepartment. Cộtidlà cột identity tự tăng với mỗi hàng mới.Truy vấn khác này tạo bảng
salesvới ba cột:sale_id,sale_datevàsale_year. Cộtsale_yearlà cột sinh tự động và được tính dựa trên cộtsale_datebằng hàmYEAR(sale_date).Partitioning và clustering
Partitioning chia dữ liệu thành các phần nhỏ hơn, cải thiện hiệu năng truy vấn, trong khi clustering tổ chức dữ liệu trong từng phân vùng để đọc nhanh hơn.
Ví dụ, truy vấn dưới đây tạo một bảng được phân vùng, trong đó dữ liệu được chia theo cột
region, giúp cải thiện hiệu năng truy vấn khi lọc theo vùng.Truy vấn dưới đây tối ưu bảng đã phân vùng bằng cách clustering dữ liệu trong mỗi phân vùng dựa trên cột
sales_amount. Nó giúp các truy vấn trênsales_amountnhanh hơn bằng cách cải thiện bố cục dữ liệu để đọc hiệu quả. Mệnh đềZORDER BYhoạt động trong phạm vi từng phân vùng để cải thiện hiệu năng đọc bằng cách gom cụm dữ liệu trong phân vùng, không phải giữa các phân vùng.Che giấu cột và lọc theo hàng
Che giấu cột và bộ lọc theo hàng hạn chế khả năng hiển thị dữ liệu dựa trên vai trò người dùng hoặc điều kiện, bảo vệ thông tin nhạy cảm.
Ví dụ, truy vấn dưới đây tạo một masked view tên
masked_tabledựa trên bảngemployees. Cộtsalaryđược làm mờ (thay bằngREDACTED) cho tất cả người dùng ngoại trừ những người có vai tròmanager. Mệnh đềCASEđảm bảo chỉ quản lý mới nhìn thấy mức lương thực tế, còn người khác thấy dữ liệu đã che giấuTương tự, truy vấn dưới đây dùng bộ lọc theo hàng để tạo hoặc thay thế một view tên
filtered_tabledựa trên bảngsales. View này lọc các hàng chỉ bao gồm dữ liệu nơiregion = 'US', giới hạn truy cập chỉ còn dữ liệu bán hàng tại Mỹ.Tiến hóa schema
Databricks hỗ trợ tiến hóa schema thông qua
CREATE OR REPLACE TABLEvà các thay đổi bảng. Bạn nên dùng câu lệnhCREATE OR REPLACE TABLEđể ghi đè schema và dữ liệu, vàALTER TABLEđể chỉnh sửa schema dần dần mà không ảnh hưởng dữ liệu.Truy vấn dưới đây thay thế bảng
employeeshiện có bằng schema mới, thêm cộthire_datemới trong khi vẫn lưu dữ liệu ở định dạng Delta.Truy vấn khác này chỉnh sửa bảng
employeesbằng cách thêm cộtsalarymới vào schema hiện có.Tinh chỉnh hiệu năng
Để tối ưu hiệu năng cho các bảng quy mô lớn, bạn có thể tận dụng nhiều thuộc tính bảng và kỹ thuật như tự động tối ưu và Z-ordering.
Trong ví dụ sau, truy vấn bật tự động tối ưu trên
delta_tablebằng cách thiết lập các thuộc tính để tự động nén file nhỏ và gộp file trong quá trình ghi, cải thiện hiệu quả lưu trữ.Tương tự, truy vấn dưới đây tối ưu
delta_tablebằng cách gom cụm dữ liệu dựa trênregionvàsales_dateđể tăng hiệu năng truy vấn, đặc biệt cho các bộ lọc trên các cột này.Thực tiễn tốt và lưu ý
Dưới đây là một số điều cần cân nhắc khi tạo bảng trong Databricks để bạn làm đúng ngay từ đầu:
Lỗi thường gặp và cách khắc phục
Sau khi đã thảo luận về thực tiễn tốt nhất để quản lý bảng trong Databricks, tôi sẽ đề cập đến các vấn đề thường gặp với bảng Databricks, thông báo lỗi tiêu biểu và cách giải quyết.
Lỗi vị trí không rỗng khi dùng CREATE so với CREATE OR REPLACE
Khi dùng
CREATE TABLEvới vị trí xác định (mệnh đềLOCATION), nếu thư mục không rỗng, bạn có thể gặp lỗi như:Lỗi này xảy ra vì lệnh
CREATE TABLEyêu cầu thư mục trống cho vị trí đã chỉ định, nhưng các tệp hoặc metadata hiện có xung đột với yêu cầu này.Để khắc phục, hãy dùng câu lệnh
CREATE OR REPLACE TABLEđể ghi đè dữ liệu và metadata hiện có. Hoặc tự dọn thư mục trước khi dùngCREATE TABLE.Không khớp schema hoặc vấn đề với một số kiểu dữ liệu
Việc chèn hoặc truy vấn dữ liệu dẫn đến lỗi không khớp schema như:
Lỗi có thể do không khớp giữa schema của bảng và kiểu dữ liệu đầu vào. Ngoài ra, các chuyển đổi kiểu dữ liệu không được hỗ trợ hoặc mơ hồ (ví dụ: kiểu lồng phức tạp) cũng có thể gây không khớp schema. Để khắc phục, hãy bắt buộc khớp schema bằng cách xác minh schema khi tạo bảng hoặc sử dụng ràng buộc schema trong các bảng Delta.
Bên cạnh đó, bạn nên cho phép tiến hóa schema khi thêm cột mới hoặc thay đổi kiểu dữ liệu.
Sử dụng ép kiểu tường minh khi chèn dữ liệu cũng sẽ giúp xử lý loại lỗi này.
Giới hạn giao dịch đồng thời với cột identity
Khi sử dụng cột identity, bạn có thể gặp vấn đề liên quan đến giao dịch đồng thời, chẳng hạn như:
Các cột identity có trạng thái và có thể gặp xung đột khi nhiều giao dịch đồng thời cố gắng chèn dữ liệu. Để khắc phục, hãy dùng khóa thay thế để thay cột identity bằng các khóa thay thế có tính quyết định, được tạo bằng các hàm như
uuid()hoặcmonotonically_increasing_id().Bạn cũng có thể dùng
MERGEcủa Delta Lake cho các quy trình chèn và cập nhật phức tạp mà không cần dựa vào cột identity.Kết luận
Trong Databricks, lệnh
CREATE TABLElà công cụ linh hoạt để định nghĩa cấu trúc dữ liệu, liên kết tới dữ liệu external và tạo ra tập dữ liệu mới thông qua truy vấn. Việc hiểu các cú pháp khác nhau để tạo và quản lý bảng trong Databricks theo nhu cầu cụ thể của bạn là rất quan trọng. Như bạn đã thấy, có một vài phương pháp tạo bảng để lựa chọn.Nếu bạn muốn khám phá các khái niệm nền tảng của Databricks, tôi rất khuyến nghị học khóa Introduction to Databricks của DataCamp để tìm hiểu về Databricks như một giải pháp kho dữ liệu cho Business Intelligence (BI). Tôi cũng khuyến nghị xem bài viết Chứng chỉ Databricks năm 2025 của chúng tôi để biết cách đạt được chứng chỉ Databricks, khám phá lợi ích nghề nghiệp, và lựa chọn chứng chỉ phù hợp với mục tiêu của bạn.