-- Hive-style table creation with schema definitionCREATETABLE hive_table (
id INT,
name STRING
)COMMENT'Hive format example'
TBLPROPERTIES ('created_by'='databricks');技术支持
-- Create or replace a sales table with a new schemaCREATEORREPLACETABLE sales (
sale_id INT,
amount FLOAT)USING DELTA
LOCATION '/mnt/delta/sales';技术支持
-- 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';技术支持
如何从现有数据创建表
要从现有数据创建表,可将表链接到 CSV、Parquet 或 JSON 等格式的外部数据文件。可以使用 LOCATION 子句链接文件路径,并使用 USING 子句指定数据格式。
-- 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;技术支持
-- Create an external table referencing data outside Databricks storageCREATETABLE 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 tableCREATETABLE sales_backup LIKE sales;技术支持
-- Create a temporary table that exists only in the sessionCREATETEMPORARYTABLE temp_table ASSELECT
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 dataCREATEORREPLACETABLE updated_table (
id BIGINT,
name STRING,
total_sales DOUBLE)USING DELTA
LOCATION '/mnt/delta/updated_table/';技术支持
-- Generated column: derived from other columnsCREATETABLE sales (
sale_id BIGINT,
sale_date DATE,
sale_year INT GENERATED ALWAYS AS(YEAR(sale_date))-- Derived column);技术支持
分区与聚簇
分区将数据拆分为更小的块以提升查询性能,而聚簇会在分区内组织数据以加快读取。
例如,下面的查询创建一个按 region 列进行分区的表,当按区域过滤时可提升查询性能。
-- Partitioned tableCREATETABLE 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 tableOPTIMIZE partitioned_table
ZORDER BY(sales_amount);-- Clusters data within partitions for efficient reads技术支持
类似地,下面的查询通过行级过滤创建或替换一个名为 filtered_table 的视图,基于 sales 表。该视图仅包含 region = 'US' 的数据,从而将访问限制为仅查看美国地区的销售数据。
-- Row filters: Fine-grained access controlCREATEORREPLACEVIEW filtered_table ASSELECT*FROM sales
WHERE region ='US';-- Limit data visibility to a specific region技术支持
架构演进
Databricks 通过 CREATE OR REPLACE TABLE 与表更改操作支持架构演进。使用 CREATE OR REPLACE TABLE 可覆盖架构与数据;使用 ALTER TABLE 可在不影响数据的情况下增量修改架构。
-- Schema evolution with CREATE OR REPLACE TABLECREATEORREPLACETABLE employees (
id BIGINT,
name STRING,
department STRING,
hire_date DATE-- New column added)USING DELTA;技术支持
另一个查询通过为现有架构新增 salary 列来修改 employees 表。
-- Altering a table schemaALTERTABLE employees ADDCOLUMNS(salary DOUBLE);技术支持
Databricks 表是 Databricks Lakehouse 平台的核心组件,旨在处理大规模的数据存储与处理。这些表可统一结构化与非结构化数据,支持分析型工作负载,并促进跨团队协作。
本文将带您通过多种在 Databricks 中使用
CREATE TABLE命令创建表的技术,包含不同语法变体以适配各类用例。我还会提供在 Databricks 中构建与管理表的最佳实践,帮助提升效率与可靠性。在开始之前,我强烈推荐阅读 DataCamp 的《如何学习 Databricks:统一数据平台初学者指南》博文,帮助您理解 Databricks 的核心特性与应用,并提供系统化的学习路径。我也建议您参加我们的 Introduction to Databricks 课程。即使您具备 SQL 经验,您也会发现 Databricks Lakehouse 平台中的一些方面看起来会有所不同。课程中的交互式练习将引导您完成 SQL 查询、平台功能以及与外部系统的连接。
Databricks 表简介
首先需要说明,Databricks 表是结构化数据集,用于在 Databricks Lakehouse 环境中便捷地组织与访问数据。主要有两种类型:
在 Databricks 中,表通常默认使用 Delta Lake,因为它具备先进的功能与优化。Delta Lake 提供ACID 事务、可扩展性、性能增强(如缓存与索引优化),以及统一的批处理与流式数据处理。
需要说明的是,早期版本的 Azure Databricks 使用传统的 “Hive 格式” 表,如今已被现代的 Delta 表所取代。总体而言,现代的 Delta 表在可靠性与性能上全面超越传统 Hive 表,因此成为 Databricks 工作流的默认选择。
下面这份摘要有助于您快速了解两者的差异:
CREATE TABLE 语法变体
Databricks 中的
CREATE TABLE命令支持多种变体以适配不同场景。每种变体都有其目的,并可针对性设置文件位置、克隆以及元数据管理等选项。若您需要回顾 Databricks SQL 的相关知识,建议阅读我们的 Databricks SQL 教程,其中也介绍了如何在 Databricks SQL 仓库中使用 Notebook。下面是主要的语法样式及其示例与说明。
CREATE TABLE [USING]
该语法用于创建带有指定架构与数据格式的新表。以下查询通过读取特定位置存放的 Parquet 文件,创建名为
sales_data的表。CREATE TABLE(Hive 格式)
这种传统语法与标准 SQL 的
CREATE TABLE命令类似,用于定义由 Databricks 管理元数据的表,而无需引用外部文件。下面的查询创建一个名为hive_table的 Hive 风格表,包含预定义架构与额外的元数据属性。在以上查询中,
COMMENT子句用于添加描述性元数据,而TBLPROPERTIES用于存储关于表的自定义属性。CREATE TABLE LIKE
该命令使用现有表的架构与属性创建新表。若您希望复制现有表的结构而不复制其数据,应使用此语法。对于测试或开发用途非常实用。
CREATE TABLE CLONE
该语法允许通过克隆现有 Delta Lake 表来创建新表,可选择深克隆或浅克隆。因此,当您需要表数据与元数据的独立副本(深克隆),或仅复制元数据并引用原始数据(浅克隆)时,应使用
CREATE TABLE CLONE。这对于版本管理或创建备份很有帮助。以下示例展示了在 Databricks 中创建深克隆与浅克隆表的查询。
CREATE OR REPLACE TABLE
这个合并的单一命令会以一次操作用新表替换现有表,同时保留相同的表名。当您希望完全覆盖现有表但保留其名称时,应使用此语法。这对在无需先删除的情况下更新表结构或数据特别有用。
下面的示例查询使用新架构创建或替换
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等列。如何从现有数据创建表
要从现有数据创建表,可将表链接到 CSV、Parquet 或 JSON 等格式的外部数据文件。可以使用
LOCATION子句链接文件路径,并使用USING子句指定数据格式。例如,下面的查询通过引用存放在
/mnt/data/sales_data/的 Parquet 文件来创建名为sales_data的表。如何使用 CTAS 创建表(CREATE TABLE AS SELECT)
您也可以通过执行查询并存储结果来创建表。此场景下,
AS SELECT子句会将查询结果写入表中。例如,下面的查询通过从现有的
sales_data表中筛选并转换数据,创建一个名为high_value_sales的新表。它筛选total_amount大于 1000 的行,并仅保留sale_id、customer_id与total_amount三列。如何创建外部表
创建外部表需要引用存放在 Databricks 托管存储之外的数据。您应使用
LOCATION子句指定外部数据位置。下面的查询通过引用
/mnt/external_storage/external_table/存放的数据,创建名为external_table的外部 Delta 表。如何创建 LIKE 表
要创建
LIKE表,可在不复制数据的前提下复制现有表的架构。如下例所示,查询会创建一个名为sales_backup的新表,其架构与现有的sales表相同。如何创建 TABLE CLONE
您可以使用
CLONE子句创建 Delta 表的浅克隆或深克隆,用于备份或测试。在下面的示例中,查询创建一个名为
sales_shallow_clone的新表,仅复制元数据(架构与表属性)。下面的示例创建一个名为
sales_deep_clone的新表,同时复制元数据与实际数据。如何创建临时表(temp table)
在创建临时表时使用
TEMPORARY子句,以确保该表仅对当前会话可见。下面的查询创建一个名为
temp_table的临时表,仅在当前会话内存在。它从sales_data中选择id、name与sales_amount,并筛选region = 'US'的行。如何替换表
您可以使用
CREATE OR REPLACE子句替换表的定义与内容。下面的查询用新的架构与数据替换已有的updated_table表,定义了三个列(id、name、total_sales)。高级主题
本节将探讨可增强功能、性能与安全性的 Databricks 表高级特性。
生成列与标识列
Databricks 支持标识列(identity columns),它会为每一行自动生成唯一值。此功能对于在数据仓库中创建代理键非常有用。
下面的查询创建一个包含三列(
id、name、department)的employees表。其中id列是自动递增的标识列。另一个查询创建了包含
sale_id、sale_date与sale_year三列的sales表。其中sale_year为生成列,基于sale_date使用YEAR(sale_date)函数自动计算。分区与聚簇
分区将数据拆分为更小的块以提升查询性能,而聚簇会在分区内组织数据以加快读取。
例如,下面的查询创建一个按
region列进行分区的表,当按区域过滤时可提升查询性能。下面的查询通过在每个分区内基于
sales_amount进行聚簇,进一步优化该分区表。它通过改进数据布局来加速对sales_amount的查询。需要注意,ZORDER BY在分区内工作,用于在分区内聚簇数据,而非跨分区聚簇。列脱敏与行级过滤
列脱敏与行级过滤可基于用户角色或条件限制数据可见性,从而保护敏感信息。
例如,下面的查询基于
employees表创建一个名为masked_table的脱敏视图。除拥有manager角色的用户外,salary列均会被打码(替换为REDACTED)。CASE语句确保只有管理者能看到真实薪资,其他用户看到的是脱敏数据。类似地,下面的查询通过行级过滤创建或替换一个名为
filtered_table的视图,基于sales表。该视图仅包含region = 'US'的数据,从而将访问限制为仅查看美国地区的销售数据。架构演进
Databricks 通过
CREATE OR REPLACE TABLE与表更改操作支持架构演进。使用CREATE OR REPLACE TABLE可覆盖架构与数据;使用ALTER TABLE可在不影响数据的情况下增量修改架构。下面的查询用新架构替换现有的
employees表,新增hire_date列,同时保持 Delta 格式存储。另一个查询通过为现有架构新增
salary列来修改employees表。性能调优
针对大规模表的性能优化,您可以利用多种表属性与技术,如自动优化与 Z-ordering。
在下面的示例中,通过设置属性以在写入时自动压缩小文件并合并文件,从而启用
delta_table的自动优化,提升存储效率。同样,下面的查询通过基于
region与sales_date聚簇数据来优化delta_table,特别能提升对这些列做过滤的查询性能。最佳实践与注意事项
在 Databricks 中创建表时,请注意以下事项,以确保操作正确:
常见陷阱与故障排除
在讨论了管理 Databricks 表的最佳实践之后,下面介绍您在使用 Databricks 表时可能遇到的常见问题、其典型报错信息及相应解决方案。
使用 CREATE 与 CREATE OR REPLACE 时的非空位置错误
当使用带有特定位置(
LOCATION子句)的CREATE TABLE时,如果目录非空,您可能会遇到如下错误:此错误的原因在于
CREATE TABLE要求指定位置的目录为空,但现有文件或元数据与该要求发生冲突。解决方法是使用
CREATE OR REPLACE TABLE以覆盖现有数据与元数据;或者先手动清理目录后再使用CREATE TABLE。架构不匹配或特定数据类型问题
在插入或查询数据时,可能会出现如下的架构不匹配错误:
该错误可能由表架构与输入数据类型不一致引起;也可能由不受支持或存在歧义的数据类型转换(如复杂嵌套类型)导致。解决方法是在创建表时强制架构校验,或在 Delta 表中启用架构约束。
此外,在新增列或更改数据类型时,您也应允许架构演进。
在插入数据时使用显式类型转换,同样有助于排查此类错误。
标识列的并发事务限制
在使用标识列时,您可能会遇到与并发事务相关的问题,例如:
标识列具有有状态特性,当多个事务试图并发插入数据时,可能发生冲突。为排查此问题,可使用代理键,用
uuid()或monotonically_increasing_id()等函数生成确定性的代理键来替代标识列。您也可以使用 Delta Lake 的
MERGE来处理复杂的插入与更新流程,而无需依赖标识列。结论
在 Databricks 中,
CREATE TABLE命令是一种多功能工具,可用于定义数据结构、链接外部数据以及通过查询生成新数据集。理解在 Databricks 中用于创建与管理表的不同语法,并根据您的需求进行选择,至关重要。正如您所见,创建表的方法并不止一种。如果您想进一步学习 Databricks 的基础概念,我强烈建议参加 DataCamp 的 Introduction to Databricks 课程,了解 Databricks 作为商业智能(BI)数据仓库解决方案的相关内容。也推荐阅读我们的2025 年 Databricks 认证博文,了解如何获取 Databricks 认证、相应的职业收益,以及如何为您的职业目标选择合适的认证。