Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
适用于: Databricks SQL
Databricks Runtime
可以使用数据源定义托管表或外部表。
语法
{ { [CREATE OR] REPLACE TABLE | CREATE [EXTERNAL] TABLE [ IF NOT EXISTS ] }
table_name
[ table_specification ]
[ USING data_source ]
[ table_clauses ]
[ AS query ] }
table_specification
( { column_identifier column_type [ column_properties ] } [, ...]
[ , table_constraint ] [...] )
column_properties
{ NOT NULL |
COLLATE collation_name |
GENERATED ALWAYS AS ( expr ) |
GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY [ ( [ START WITH start | INCREMENT BY step ] [ ...] ) ] |
DEFAULT default_expression |
COMMENT column_comment |
column_constraint |
MASK clause } [ ... ]
table_clauses
{ OPTIONS clause |
PARTITIONED BY clause |
CLUSTER BY clause |
clustered_by_clause |
LOCATION path [ WITH ( CREDENTIAL credential_name ) ] |
COMMENT table_comment |
TBLPROPERTIES clause |
DEFAULT COLLATION default_collation_name |
WITH { ROW FILTER clause } } [...]
clustered_by_clause
{ CLUSTERED BY ( cluster_column [, ...] )
[ SORTED BY ( { sort_column [ ASC | DESC ] } [, ...] ) ]
INTO num_buckets BUCKETS }
在 Databricks Runtime 16.1 之前的版本中,START WITH
必须在 INCREMENT BY
之前。
parameters
REPLACE
如果指定了该参数,则会替换已存在的表及其内容。 仅 Delta 表和 Apache Iceberg 表支持此子句。
REPLACE
保留 表历史记录 和授予的权限、行筛选器和列掩码。注意
Azure Databricks 强烈建议使用
REPLACE
,而不是删除和重新创建表。EXTERNAL
如果已指定,则会创建一个外部表。 创建外部表时,还必须提供
LOCATION
子句。 删除外部表时,不会删除位于LOCATION
处的文件。如果不存在
如果指定了该参数,并且已存在名称相同的表,则会忽略该语句。
IF NOT EXISTS
无法与REPLACE
共存,这意味着不允许使用CREATE OR REPLACE TABLE IF NOT EXISTS
。-
要创建的表的名称。 名称不得包含时态规范或选项规范。 如果未限定该名称,则会在当前架构中创建该表。
hive_metastore
中创建的表只能包含字母数字 ASCII 字符和下划线 (INVALID_SCHEMA_OR_RELATION_NAME)。必须在 Unity Catalog 中创建 Iceberg 表。 不支持在
hive_metastore
中创建 Iceberg 表。 表格规范
此可选子句定义列的列表、列的类型、属性、说明和列约束。
如果未在表架构中定义列,则必须指定
AS query
或LOCATION
。-
列的唯一名称。
不包含列映射属性 (
'delta.columnMapping.mode' = 'name'
) 的 Delta 表的列标识符不得包含空格或以下字符:, ; { } ( ) \n \t =
表的
AVRO
列标识符必须以下划线(_
)或 Unicode 字母(包括非 ASCII 字母)开头,后跟 Unicode 字母、数字和下划线的组合。表的
ICEBERG
列标识符必须唯一且不区分大小写,并遵循标准 SQL 标识符规则。 避免使用空格或特殊字符,因为它们可能不受所有查询引擎支持。 -
指定列的数据类型。 并非所有数据源都支持 Azure Databricks 支持的所有数据类型。
NOT NULL
如果指定,则列不接受
NULL
值。 仅 Delta 表和 Iceberg 表支持此子句。COLLATE collation_name
适用于: Databricks SQL 勾选标记为“是” Databricks Runtime 16.1 及更高版本check marked yes
对于
STRING
column_type
,可以选择为此列的比较和排序操作命名要应用的排序规则。 默认排序规则为表default_collation_name
。GENERATED ALWAYS AS ( expr )
指定此子句后,此列的值取决于
expr
。表的
DEFAULT COLLATION
须为UTF8_BINARY
。expr
可能包含文本、表中的列标识符以及内置的确定性 SQL 函数或运算符,但以下内容除外:此外,
expr
不能包含任何expr
。GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY [ ( [ START WITH start ] [ INCREMENT BY step ] ) ]
适用于:
Databricks SQL
Databricks Runtime 10.4 LTS 及更高版本
定义标识列。 如果你写入表但没有为标识列提供值,它将自动分配一个唯一且统计上递增的值(如果
step
为负数则递减)。 只有 Delta 表支持此子句。 此子句只能用于具有 BIGINT 数据类型的列。自动分配的值以
start
开头并以step
为增量。 分配的值是唯一的,但不保证是连续的。 这两个参数都是可选的,默认值为 1。step
不能为0
。如果自动分配的值超出标识列类型的范围,则查询将失败。
使用
ALWAYS
时,不能为标识列提供自己的值。不支持以下操作:
-
PARTITIONED BY
是标识列 -
UPDATE
是标识列
注意
在表上声明标识列会禁用并发事务。 仅在不需要对目标表进行并发写入的用例中使用标识列。
-
默认default_expression
适用于:
Databricks SQL
Databricks Runtime 11.3 LTS 及更高版本
为列定义一个
DEFAULT
值,当未指定该列时,将在INSERT
、UPDATE
和MERGE ... INSERT
上使用该值。如果未指定默认值,则
DEFAULT NULL
应用于可为空的列。default_expression
可以由字面量和内置 SQL 函数或运算符组成,但以下情况除外:此外,
default_expression
不能包含任何default_expression
。DEFAULT
、CSV
、JSON
和PARQUET
源支持ORC
。COMMENT column_comment
用于描述列的字符串字面量。
-
将主键或外键约束添加到表中的列。
hive_metastore
目录中的表不支持约束。若要向表添加检查约束,请使用 ALTER TABLE。
-
适用于:
Databricks SQL
Databricks Runtime 12.2 LTS 及更高版本
仅 Unity Catalog
添加列掩码函数以对敏感数据进行匿名化处理。 该列的所有后续查询将会收到对该列计算该函数(而不是该列的原始值)的结果。 这对于细粒度的访问控制目的非常有用,在这种情况下,该函数可以检查调用用户的身份或组成员身份,以便决定是否编辑该值。
如果要替换表,并且新表包含与原始表相同的列名称,则保留任何现有列掩码,即使它们未显式重新定义。 这可以防止意外丢失数据访问策略。
-
向表添加信息性主键或信息性外键约束。
hive_metastore
目录中的表不支持键约束。若要向表添加检查约束,请使用 ALTER TABLE。
-
使用data_source
data_source
可以是文件格式,也可以是联合 JDBC 数据源。文件格式必须是以下之一:
AVRO
BINARYFILE
CSV
DELTA
ICEBERG
JSON
ORC
PARQUET
TEXT
对于
DELTA
或ICEBERG
之外的任何文件格式,必须指定一个LOCATION
,除非表目录是hive_metastore
。支持以下联合 JDBC 源:
POSTGRESQL
SQLSERVER
MYSQL
BIGQUERY
NETSUITE
ORACLE
REDSHIFT
SNOWFLAKE
SQLDW
SYNAPSE
SALESFORCE
SALESFORCE_DATA_CLOUD
TERADATA
WORKDAY_RAAS
MONGODB
指定联合 JDBC 源时,还必须指定带有必要连接信息的
OPTIONS
子句。 有关查询联合数据源的详细信息,请参阅使用 JDBC 查询数据库。Databricks Runtime 支持用于表的以下附加文件格式:
JDBC
LIBSVM
-
org.apache.spark.sql.sources.DataSourceRegister
的自定义实现的完全限定的类名。
如果省略
USING
,则默认值为DELTA
。以下内容适用于:Databricks Runtime
支持
HIVE
在 Databricks Runtime 中创建 Hive SerDe 表。 你可以使用file_format
子句指定 Hive 特定的row_format
和OPTIONS
,这是不区分大小写的字符串映射。option_keys
为:FILEFORMAT
INPUTFORMAT
OUTPUTFORMAT
SERDE
FIELDDELIM
ESCAPEDELIM
MAPKEYDELIM
LINEDELIM
table_clauses
可选择指定新表的位置、分区、群集、选项、注释和用户定义的属性。 每个子子句只能指定一次。
-
用于按列子集对表进行分区的可选子句。
注意
对于托管的 Iceberg 表,Azure Databricks 不支持
PARTITIONED BY
。 改用液体聚类分析(CLUSTER BY
)来优化数据布局。 对于 Delta 表,如果省略表定义,则 Azure Databricks 会将分区列放在表末尾,即使前面在列规范中列出它们也是如此。 -
适用于:
Databricks SQL
、Databricks Runtime 13.3 及更高版本
一个可选子句,用于按列的子集对 Delta 或 Iceberg 表进行聚类。 请参阅 对表使用液体聚类分析。 若要对其他表进行聚类分析,请使用
clustered_by_clause
。当你使用
CLUSTER BY
时,必须显式禁用 Iceberg 表的删除向量和行 ID。使用自动聚类功能与
CLUSTER BY AUTO
,Databricks智能地选择聚类键以优化查询性能。不能将液体聚类与
PARTITIONED BY
结合。 按子句聚类
可选择使用列子集将表或每个分区聚集到固定数量的哈希桶中。
Delta 或 Iceberg 表不支持此子句。 请改用
CLUSTER BY
。CLUSTERED BY
指定列集,用于聚集每个分区,如果未指定任何分区,则用于聚集表。
-
引用表中
column_identifier
的标识符。 如果指定多列,则不能有重复项。 由于群集在分区级别进行操作,因此不能将分区列同时命名为群集列。
-
排序依据
可选择保留桶中的行的排序顺序。
sort_column
用于对桶进行排序的列。 该列不能为分区列。 排序列必须是唯一的。
ASC 或 DESC
可选择指定是按升序 (
sort_column
) 还是降序 (ASC
) 对DESC
进行排序。 默认值为ASC
。
INTO num_buckets BUCKET
一个整数文本,用于指定将每个分区(或表 [如果未指定任何分区])划分到的 Bucket 数目。
LOCATION 路径 [WITH(CREDENTIAL credential_name)]
用于存储表数据的可选目录路径,可以是分布式存储上的一个路径。
path
必须是字符串字面量。 如果未指定位置,则会将表视为managed table
,并且 Azure Databricks 会创建默认表位置。指定一个位置会使表成为外部表。
对于未驻留在
hive_metastore
目录中的表(表path
),必须由外部位置保护,除非指定了有效的存储凭据。不能在与托管表的位置重叠的位置创建外部表。
如果在
LOCATION
路径上已存在数据,那么 Delta 表将继承其配置。 因此,任何指定的TBLPROPERTIES
或table_specification
PARTITIONED BY
子句必须完全匹配 Delta 位置的现有数据。对于 Iceberg 表,不支持该
LOCATION
子句。 当你创建外部目录时,外部 Iceberg 表会自动注册,并且必须创建托管 Iceberg 表,无需指定位置。-
设置或重置一个或多个用户定义的表选项。
COMMENT table_comment
用于描述表的字符串字面量。
-
可以选择设置一个或多个用户定义的属性。
DEFAULT COLLATION default_collation_name
适用于:
Databricks SQL
Databricks Runtime 16.3 及更高版本
定义要用于以下项的默认排序规则:
- 表的
STRING
列和字段 -
DEFAULT
表达式 -
CREATE TABLE AS query
的正文
CHECK
约束和生成列表达式需要默认排序规则为UTF8_BINARY
。如果未指定,则默认排序规则派生自在其中创建表的架构。
- 表的
WITH ROW FILTER 子句
适用于:
Databricks SQL
Databricks Runtime 12.2 LTS 及更高版本
仅 Unity Catalog
向表中添加行筛选器函数。 该表中的所有后续查询都将收到函数计算结果为布尔值 TRUE 的行的子集。 这对于细粒度的访问控制目的非常有用,在这种情况下,该函数可以检查调用用户的身份或组成员身份,以决定是否筛选特定行。
如果要替换表,则保留任何现有行筛选器,即使它们未显式重新定义。 这可以防止意外丢失数据访问策略。
-
AS 查询
此可选子句使用
query
中的数据来填充表。 指定query
时,不能同时指定table_specification
。 表架构派生自查询。请注意,Azure Databricks 会用输入查询的数据覆盖基础数据源,确保创建的表包含与输入查询完全相同的数据。
示例
-- Creates a Delta table
> CREATE TABLE student (id INT, name STRING, age INT);
-- Creates a managed Iceberg table
> CREATE TABLE edu.enrollment.student (id INT, name STRING, age INT) USING ICEBERG;
-- Use data from another table
> CREATE TABLE student_copy AS SELECT * FROM student;
-- Creates a CSV table from an external directory
> CREATE TABLE student USING CSV LOCATION '/path/to/csv_files';
-- Specify table comment and properties
> CREATE TABLE student (id INT, name STRING, age INT)
COMMENT 'this is a comment'
TBLPROPERTIES ('foo'='bar');
-- Specify table comment and properties with different clauses order
> CREATE TABLE student (id INT, name STRING, age INT)
TBLPROPERTIES ('foo'='bar')
COMMENT 'this is a comment';
-- Create partitioned table
> CREATE TABLE student (id INT, name STRING, age INT)
PARTITIONED BY (age);
-- Create a table with a generated column
> CREATE TABLE rectangles(a INT, b INT,
area INT GENERATED ALWAYS AS (a * b));
-- Create a table with a string column with a case-insensitive collation.
> CREATE TABLE names(name STRING COLLATE UNICODE_CI);
-- Create a table with a default collation and override for a specific column.
> CREATE TABLE names(name STRING, first_name STRING, id STRING COLLATE UTF8_BINARY) DEFAULT COLLATION UNICODE_CI;
-- Create an external table connected to Oracle
> CREATE TABLE IF NOT EXISTS ora_tab
USING ORACLE
OPTIONS (
url '<jdbc-url>',
dbtable '<table-name>',
user '<username>',
password '<password>'
);
> SELECT * FROM ora_tab;
相关文章
- ALTER TABLE
- 约束
- 按组排序
- 创建类似表
- 创建表克隆
- DROP TABLE
- PARTITIONED BY
- 表属性和表选项