跳至主要内容

Databricks 中的 CREATE TABLE:构建与管理表的完整指南

了解如何在 Databricks 中使用 CREATE TABLE 命令创建表。学习适配不同场景的多种方法,包括如何从现有数据创建表以及如何使用 CREATE TABLE AS SELECT。
· 10分钟 阅读

使用 AI 探索

Databricks 表是 Databricks Lakehouse 平台的核心组件,旨在处理大规模的数据存储与处理。这些表可统一结构化与非结构化数据,支持分析型工作负载,并促进跨团队协作。

本文将带您通过多种在 Databricks 中使用 CREATE TABLE 命令创建表的技术,包含不同语法变体以适配各类用例。我还会提供在 Databricks 中构建与管理表的最佳实践,帮助提升效率与可靠性。

在开始之前,我强烈推荐阅读 DataCamp 的《如何学习 Databricks:统一数据平台初学者指南》博文,帮助您理解 Databricks 的核心特性与应用,并提供系统化的学习路径。我也建议您参加我们的 Introduction to Databricks 课程。即使您具备 SQL 经验,您也会发现 Databricks Lakehouse 平台中的一些方面看起来会有所不同。课程中的交互式练习将引导您完成 SQL 查询、平台功能以及与外部系统的连接。

Databricks 表简介

首先需要说明,Databricks 表是结构化数据集,用于在 Databricks Lakehouse 环境中便捷地组织与访问数据。主要有两种类型:

  • 托管表(Managed Tables): 这类表完全由 Databricks 管理,包括存储与元数据。当创建托管表时,Databricks 会负责底层数据文件;当删除该表时,相应的数据也会被移除。
  • 外部表(External Tables): 外部表引用存放在 Databricks 之外的数据,通常位于云存储系统,如 AWS S3 或 Azure Blob Storage。Databricks 管理这些表的元数据,但即便删除了表,实际数据仍会保留。这类表也称为非托管表(unmanaged tables)。

在 Databricks 中,表通常默认使用 Delta Lake,因为它具备先进的功能与优化。Delta Lake 提供ACID 事务、可扩展性、性能增强(如缓存与索引优化),以及统一的批处理与流式数据处理。

需要说明的是,早期版本的 Azure Databricks 使用传统的 “Hive 格式” 表,如今已被现代的 Delta 表所取代。总体而言,现代的 Delta 表在可靠性与性能上全面超越传统 Hive 表,因此成为 Databricks 工作流的默认选择。

下面这份摘要有助于您快速了解两者的差异:

特性Hive 格式表Delta 表
数据格式Apache Hive(CSV、Parquet、ORC 等)Delta Lake(基于 Parquet 并带有元数据)
事务不支持 ACID(最终一致性)完整的 ACID 事务
架构管理约束较弱严格的架构约束
性能优化需要手动调优内置优化(缓存、压缩整理)
时光回溯不支持历史查询支持时光回溯,可查询数据的历史版本
并发性更新或删除时易产生冲突高效处理并发操作

CREATE TABLE 语法变体

Databricks 中的 CREATE TABLE 命令支持多种变体以适配不同场景。每种变体都有其目的,并可针对性设置文件位置、克隆以及元数据管理等选项。若您需要回顾 Databricks SQL 的相关知识,建议阅读我们的 Databricks SQL 教程,其中也介绍了如何在 Databricks SQL 仓库中使用 Notebook。

下面是主要的语法样式及其示例与说明。

CREATE TABLE [USING]

该语法用于创建带有指定架构与数据格式的新表。以下查询通过读取特定位置存放的 Parquet 文件,创建名为 sales_data 的表。

-- Create a table from files in a specific format
CREATE TABLE sales_data
USING PARQUET
LOCATION '/mnt/data/sales';

CREATE TABLE(Hive 格式)

这种传统语法与标准 SQL 的 CREATE TABLE 命令类似,用于定义由 Databricks 管理元数据的表,而无需引用外部文件。下面的查询创建一个名为 hive_table 的 Hive 风格表,包含预定义架构与额外的元数据属性。

-- Hive-style table creation with schema definition
CREATE TABLE hive_table (
    id INT,
    name STRING
)
COMMENT 'Hive format example'
TBLPROPERTIES ('created_by' = 'databricks');

在以上查询中,COMMENT 子句用于添加描述性元数据,而 TBLPROPERTIES 用于存储关于表的自定义属性。

CREATE TABLE LIKE

该命令使用现有表的架构与属性创建新表。若您希望复制现有表的结构而不复制其数据,应使用此语法。对于测试或开发用途非常实用。

-- Create a table with the same schema as another table
CREATE TABLE new_table LIKE existing_table;

CREATE TABLE CLONE

该语法允许通过克隆现有 Delta Lake 表来创建新表,可选择深克隆或浅克隆。因此,当您需要表数据与元数据的独立副本(深克隆),或仅复制元数据并引用原始数据(浅克隆)时,应使用 CREATE TABLE CLONE。这对于版本管理或创建备份很有帮助。

以下示例展示了在 Databricks 中创建深克隆与浅克隆表的查询。

 -- Deep clone by default
CREATE TABLE cloned_table CLONE original_table;

-- Shallow clone
CREATE TABLE shallow_clone_table SHALLOW CLONE original_table;  

CREATE OR REPLACE TABLE

这个合并的单一命令会以一次操作用新表替换现有表,同时保留相同的表名。当您希望完全覆盖现有表但保留其名称时,应使用此语法。这对在无需先删除的情况下更新表结构或数据特别有用。

下面的示例查询使用新架构创建或替换 sales 表。

-- Create or replace a sales table with a new schema
CREATE OR REPLACE TABLE sales (
    sale_id INT,
    amount FLOAT
)
USING DELTA
LOCATION '/mnt/delta/sales';

在 Databricks 中,您还可以结合其他相关子句与 CREATE TABLE 语法一起使用,以按需管理表。以下是这些子句的用法概览。文中示例已展示了部分(但非全部)子句。

  • IF NOT EXISTS:若表已存在则跳过创建,避免报错。

  • USING:指定文件格式(例如 Delta、Parquet、CSV)。

  • EXTERNAL:声明数据位于 Databricks 托管存储之外的表。

  • PARTITIONED BY:定义分区以优化大型数据集。

  • LOCATION:指向表数据所在的目录。

  • TBLPROPERTIES:添加用于自定义配置与优化的元数据。

分步演示

本节将演示在 Databricks 中创建与管理表的不同方式,附以简明示例与关键子句说明。建议参考我们的《Databricks 教程:数据从业者必知的 7 个概念》,了解如何在 Databricks 平台中运行 SQL 命令。

如何创建一个空表

要创建一个空的 Delta 表,请定义包含列名与数据类型的表架构。使用 USING DELTA 指定表格式,并用 COMMENT 添加描述性元数据。

下面的查询创建一个名为 employees 的空 Delta 表,预定义了 id、name、department 与 hire_date 等列。

-- Create an empty Delta table with a defined schema
CREATE TABLE employees (
    id BIGINT,
    name STRING,
    department STRING,
    hire_date DATE
)
USING DELTA
COMMENT 'Table to store employee information';

如何从现有数据创建表

要从现有数据创建表,可将表链接到 CSV、Parquet 或 JSON 等格式的外部数据文件。可以使用 LOCATION 子句链接文件路径,并使用 USING 子句指定数据格式。

例如,下面的查询通过引用存放在 /mnt/data/sales_data/ 的 Parquet 文件来创建名为 sales_data 的表。

-- Create a table from Parquet files in a specified location
CREATE TABLE sales_data
USING PARQUET
LOCATION '/mnt/data/sales_data/';

如何使用 CTAS 创建表(CREATE TABLE AS SELECT)

您也可以通过执行查询并存储结果来创建表。此场景下,AS SELECT 子句会将查询结果写入表中。

例如,下面的查询通过从现有的 sales_data 表中筛选并转换数据,创建一个名为 high_value_sales 的新表。它筛选 total_amount 大于 1000 的行,并仅保留 sale_id、customer_id 与 total_amount 三列。

-- Create a table by selecting and transforming data from another table
CREATE TABLE high_value_sales AS
SELECT
    sale_id,
    customer_id,
    total_amount
FROM sales_data
WHERE total_amount > 1000;

如何创建外部表

创建外部表需要引用存放在 Databricks 托管存储之外的数据。您应使用 LOCATION 子句指定外部数据位置。

下面的查询通过引用 /mnt/external_storage/external_table/ 存放的数据,创建名为 external_table 的外部 Delta 表。

-- Create an external table referencing data outside Databricks storage
CREATE TABLE external_table
USING DELTA
LOCATION '/mnt/external_storage/external_table/';

如何创建 LIKE 表

要创建 LIKE 表,可在不复制数据的前提下复制现有表的架构。如下例所示,查询会创建一个名为 sales_backup 的新表,其架构与现有的 sales 表相同。

-- Create a new sales table with the same schema as an existing table
CREATE TABLE sales_backup LIKE sales;

如何创建 TABLE CLONE

您可以使用 CLONE 子句创建 Delta 表的浅克隆或深克隆,用于备份或测试。

在下面的示例中,查询创建一个名为 sales_shallow_clone 的新表,仅复制元数据(架构与表属性)。

-- Shallow clone: Copies only metadata (references original data)
CREATE TABLE sales_shallow_clone CLONE sales_data;

下面的示例创建一个名为 sales_deep_clone 的新表,同时复制元数据与实际数据。

-- Deep clone: Copies both metadata and actual data
CREATE TABLE sales_deep_clone CLONE sales_data DEEP;

如何创建临时表(temp table)

在创建临时表时使用 TEMPORARY 子句,以确保该表仅对当前会话可见。

下面的查询创建一个名为 temp_table 的临时表,仅在当前会话内存在。它从 sales_data 中选择 id、name 与 sales_amount,并筛选 region = 'US' 的行。

-- Create a temporary table that exists only in the session
CREATE TEMPORARY TABLE temp_table AS
SELECT
    id,
    name,
    sales_amount
FROM sales_data
WHERE region = 'US';

如何替换表

您可以使用 CREATE OR REPLACE 子句替换表的定义与内容。下面的查询用新的架构与数据替换已有的 updated_table 表,定义了三个列(id、name、total_sales)。

-- Replace an existing table with a new schema or data
CREATE OR REPLACE TABLE updated_table (
    id BIGINT,
    name STRING,
    total_sales DOUBLE
)
USING DELTA
LOCATION '/mnt/delta/updated_table/';

高级主题

本节将探讨可增强功能、性能与安全性的 Databricks 表高级特性。

生成列与标识列

Databricks 支持标识列(identity columns),它会为每一行自动生成唯一值。此功能对于在数据仓库中创建代理键非常有用。

下面的查询创建一个包含三列(id、name、department)的 employees 表。其中 id 列是自动递增的标识列。

-- Identity column: auto-incremented value
CREATE TABLE employees (
    id BIGINT GENERATED ALWAYS AS IDENTITY, -- Auto-incremented column
    name STRING,
    department STRING
);

另一个查询创建了包含 sale_id、sale_date 与 sale_year 三列的 sales 表。其中 sale_year 为生成列,基于 sale_date 使用 YEAR(sale_date) 函数自动计算。

-- Generated column: derived from other columns
CREATE TABLE sales (
    sale_id BIGINT,
    sale_date DATE,
    sale_year INT GENERATED ALWAYS AS (YEAR(sale_date)) -- Derived column
);

分区与聚簇

分区将数据拆分为更小的块以提升查询性能,而聚簇会在分区内组织数据以加快读取。

例如,下面的查询创建一个按 region 列进行分区的表,当按区域过滤时可提升查询性能。

-- Partitioned table
CREATE TABLE partitioned_table (
    id BIGINT,
    region STRING,
    sales_amount DOUBLE
)
USING DELTA
PARTITIONED BY (region); -- Querying by region will be faster

下面的查询通过在每个分区内基于 sales_amount 进行聚簇,进一步优化该分区表。它通过改进数据布局来加速对 sales_amount 的查询。需要注意,ZORDER BY 在分区内工作,用于在分区内聚簇数据,而非跨分区聚簇。

-- Clustered table
OPTIMIZE partitioned_table
ZORDER BY (sales_amount); -- Clusters data within partitions for efficient reads

列脱敏与行级过滤

列脱敏与行级过滤可基于用户角色或条件限制数据可见性,从而保护敏感信息。

例如,下面的查询基于 employees 表创建一个名为 masked_table 的脱敏视图。除拥有 manager 角色的用户外,salary 列均会被打码(替换为 REDACTED)。CASE 语句确保只有管理者能看到真实薪资,其他用户看到的是脱敏数据。

-- Column masking: Redact sensitive data
CREATE MASKED VIEW masked_table AS
SELECT
    id,
    name,
    CASE
        WHEN current_user() = 'manager' THEN salary
        ELSE 'REDACTED'
    END AS salary
FROM employees;

类似地,下面的查询通过行级过滤创建或替换一个名为 filtered_table 的视图,基于 sales 表。该视图仅包含 region = 'US' 的数据,从而将访问限制为仅查看美国地区的销售数据。

-- Row filters: Fine-grained access control
CREATE OR REPLACE VIEW filtered_table AS
SELECT *
FROM sales
WHERE region = 'US'; -- Limit data visibility to a specific region

架构演进

Databricks 通过 CREATE OR REPLACE TABLE 与表更改操作支持架构演进。使用 CREATE OR REPLACE TABLE 可覆盖架构与数据;使用 ALTER TABLE 可在不影响数据的情况下增量修改架构。

下面的查询用新架构替换现有的 employees 表,新增 hire_date 列,同时保持 Delta 格式存储。

-- Schema evolution with CREATE OR REPLACE TABLE
CREATE OR REPLACE TABLE employees (
    id BIGINT,
    name STRING,
    department STRING,
    hire_date DATE -- New column added
)
USING DELTA;

另一个查询通过为现有架构新增 salary 列来修改 employees 表。

-- Altering a table schema
ALTER TABLE employees ADD COLUMNS (salary DOUBLE);

性能调优

针对大规模表的性能优化,您可以利用多种表属性与技术,如自动优化与 Z-ordering。

在下面的示例中,通过设置属性以在写入时自动压缩小文件并合并文件,从而启用 delta_table 的自动优化,提升存储效率。

-- Enable automatic optimizations
ALTER TABLE delta_table
SET TBLPROPERTIES (
    'delta.autoOptimize.optimizeWrite' = 'true', -- Automatically compact small files
    'delta.autoOptimize.autoCompact' = 'true'   -- Automatically merge files
);

同样,下面的查询通过基于 region 与 sales_date 聚簇数据来优化 delta_table,特别能提升对这些列做过滤的查询性能。

-- Perform clustering for faster query performance
OPTIMIZE delta_table
ZORDER BY (region, sales_date); -- Improves query efficiency for frequent filters

最佳实践与注意事项

在 Databricks 中创建表时,请注意以下事项,以确保操作正确:

  • 表命名规范: 始终使用清晰且一致的命名以提升可发现性并减少错误。避免使用特殊字符或过长名称,以免造成兼容性问题。
  • 安全与权限: 使用 Unity Catalog 对所有数据资产进行集中式访问控制。通过访问控制列表(ACL)限制可查看或修改数据的人员。同时,使用列脱敏或行级过滤来保护敏感数据。
  • 备份与恢复: 利用 Delta Lake 的版本历史实现简便的恢复与时光回溯。定期监控与管理历史版本保留策略,以平衡存储成本与恢复需求。
  • 托管表 vs. 外部表:理解托管表与外部表的区别同样重要。托管表中,Databricks 同时管理元数据与数据,适合需要全面控制数据生命周期的场景。而外部表引用的数据存放在 Databricks 之外,适用于在不同平台或系统间共享并保持对数据控制权的情形。

常见陷阱与故障排除

在讨论了管理 Databricks 表的最佳实践之后,下面介绍您在使用 Databricks 表时可能遇到的常见问题、其典型报错信息及相应解决方案。

使用 CREATE 与 CREATE OR REPLACE 时的非空位置错误

当使用带有特定位置(LOCATION 子句)的 CREATE TABLE 时,如果目录非空,您可能会遇到如下错误:

Error: Cannot create table because the location is not empty.

此错误的原因在于 CREATE TABLE 要求指定位置的目录为空,但现有文件或元数据与该要求发生冲突。

解决方法是使用 CREATE OR REPLACE TABLE 以覆盖现有数据与元数据;或者先手动清理目录后再使用 CREATE TABLE。

CREATE OR REPLACE TABLE delta_table
USING DELTA
LOCATION '/mnt/data/delta_table'; -- Overwrites table and files

架构不匹配或特定数据类型问题

在插入或查询数据时,可能会出现如下的架构不匹配错误:

Error: Schema mismatch: Expected column type STRING, but found INT.

该错误可能由表架构与输入数据类型不一致引起;也可能由不受支持或存在歧义的数据类型转换(如复杂嵌套类型)导致。解决方法是在创建表时强制架构校验,或在 Delta 表中启用架构约束。

-- Enforce schema matching during table creation
CREATE TABLE schema_table (
    id INT,
    name STRING
)
USING DELTA
TBLPROPERTIES ('delta.schema.enforce' = 'true'); -- Enforces strict schema

此外,在新增列或更改数据类型时,您也应允许架构演进。

ALTER TABLE schema_table ADD COLUMNS (new_column DOUBLE);

在插入数据时使用显式类型转换,同样有助于排查此类错误。

INSERT INTO schema_table SELECT CAST(id AS INT), CAST(name AS STRING) FROM source_table;

标识列的并发事务限制

在使用标识列时,您可能会遇到与并发事务相关的问题,例如:

Error: Concurrent transactions detected on identity column table

标识列具有有状态特性,当多个事务试图并发插入数据时,可能发生冲突。为排查此问题,可使用代理键,用 uuid() 或 monotonically_increasing_id() 等函数生成确定性的代理键来替代标识列。

CREATE TABLE better_table AS
SELECT
    monotonically_increasing_id() AS id, -- Replaces identity column
    name, department
FROM source_data;

您也可以使用 Delta Lake 的 MERGE 来处理复杂的插入与更新流程,而无需依赖标识列。

MERGE INTO target_table AS t
USING source_table AS s
ON t.id = s.id
WHEN MATCHED THEN UPDATE SET *
WHEN NOT MATCHED THEN INSERT *;

结论

在 Databricks 中,CREATE TABLE 命令是一种多功能工具,可用于定义数据结构、链接外部数据以及通过查询生成新数据集。理解在 Databricks 中用于创建与管理表的不同语法,并根据您的需求进行选择,至关重要。正如您所见,创建表的方法并不止一种。

如果您想进一步学习 Databricks 的基础概念,我强烈建议参加 DataCamp 的 Introduction to Databricks 课程,了解 Databricks 作为商业智能(BI)数据仓库解决方案的相关内容。也推荐阅读我们的2025 年 Databricks 认证博文,了解如何获取 Databricks 认证、相应的职业收益,以及如何为您的职业目标选择合适的认证。

Allan Ouko

作者

Allan Ouko

数据科学技术写作者,具备数据分析、商业智能和数据科学的一线实践经验。我撰写以行业为导向的实用内容,涵盖 SQL、Python、Power BI、Databricks 和数据工程,并以真实的分析工作为基础。我的写作兼顾技术深度与业务影响,帮助专业人士将数据转化为自信的决策。

Databricks CREATE TABLE 常见问答

在 Databricks 中,CREATE TABLE 命令的作用是什么?

CREATE TABLE 命令用于在 Databricks 中定义新表,允许用户指定表的架构、数据格式与存储位置。

托管表与外部表有什么区别?

托管表在 Databricks 中同时存储元数据与数据;外部表仅在 Databricks 中存储元数据,实际数据保存在外部位置。

外部表与非托管表是同一个概念吗?

是的,外部表与非托管表在 Databricks 中指的是同一概念。它们在 Databricks 中存储元数据,但将实际数据保存在外部位置,使您可独立管理数据生命周期。

什么是浅克隆与深克隆?

浅克隆仅复制元数据,深克隆会复制数据与元数据。

什么是临时表?

临时表仅在当前会话中存在,会在会话结束后自动删除。

什么是 Databricks 中的架构演进?

架构演进允许在无需重建整张表的情况下修改现有表的架构(例如新增或修改列),这对 Delta 表尤其有益。

主题