CREATE TABLE [USING]
可以使用数据源定义托管表或外部表。
语法
{ { [CREATE OR] REPLACE TABLE | CREATE TABLE [ IF NOT EXISTS ] }
table_name
[ table_specification ] [ USING data_source ]
[ table_clauses ]
[ AS query ] }
table_specification
( { column_identifier column_type [ NOT NULL ]
[ GENERATED ALWAYS AS ( expr ) |
GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY [ ( [ START WITH start ] [ INCREMENT BY step ] ) ] ]
[ COMMENT column_comment ]
[ column_constraint ] } [, ...]
[ , table_constraint ] [...] )
table_clauses
{ OPTIONS clause |
PARTITIONED BY clause |
clustered_by_clause |
LOCATION path [ WITH ( CREDENTIAL credential_name ) ] |
COMMENT table_comment |
TBLPROPERTIES clause } [...]
clustered_by_clause
{ CLUSTERED BY ( cluster_column [, ...] )
[ SORTED BY ( { sort_column [ ASC | DESC ] } [, ...] ) ]
INTO num_buckets BUCKETS }
parameters
REPLACE
如果指定了该参数,则会替换已存在的表及其内容。 只有 Delta Lake 表支持此子句。
注意
Azure Databricks 强烈建议使用
REPLACE,而不是删除再重新创建 Delta Lake 表。IF NOT EXISTS
如果指定了该参数,并且已存在名称相同的表,则会忽略该语句。
IF NOT EXISTS无法与REPLACE共存,这意味着不允许使用CREATE OR REPLACE TABLE IF NOT EXISTS。-
要创建的表的名称。 名称不得包含时态规范。 如果未限定该名称,则会在当前架构中创建该表。
table_specification
此可选子句定义列的列表、列的类型、属性、说明和列约束。
如果未在表架构中定义列,则必须指定
AS query或LOCATION。-
列的唯一名称。
-
指定列的数据类型。 并非所有数据源都支持 Azure Databricks 支持的所有数据类型。
NOT NULL
如果指定了该参数,则列不会接受
NULL值。 只有 Delta Lake 表支持此子句。GENERATED ALWAYS AS ( expr )
指定此子句后,此列的值取决于
expr。expr可能包含文本、表中的列标识符以及内置的确定性 SQL 函数或运算符,但以下内容除外:此外,
expr不能包含任何expr。GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY [ ( [ START WITH start ] [ INCREMENT BY step ] ) ]
定义标识列。 如果你写入表但没有为标识列提供值,它将自动分配一个唯一且统计上递增的值(如果
step为负数则递减)。 只有 Delta Lake 表支持此子句。 此子句只能用于具有 BIGINT 数据类型的列。自动分配的值以
start开头并以step为增量。 分配的值是唯一的,但不保证是连续的。 这两个参数都是可选的,默认值为 1。step不能为0。如果自动分配的值超出标识列类型的范围,则查询将失败。
使用
ALWAYS时,不能为标识列提供自己的值。不支持以下操作:
- 由标识列分区
- UPDATE 标识列
COMMENT column_comment
用于描述列的字符串字面量。
-
向 Delta Lake 表中的列添加主键或外键约束。
hive_metastore目录中的表不支持约束。若要向 Delta Lake 表添加 CHECK 约束,请使用 ALTER TABLE。
-
向 Delta Lake 表添加主键或外键约束。
hive_metastore目录中的表不支持约束。若要向 Delta Lake 表添加 CHECK 约束,请使用 ALTER TABLE。
-
USING data_source
将要用于表的文件格式。
data_source必须是以下各项之一:TEXTAVROCSVJSONJDBCPARQUETORCDELTALIBSVMorg.apache.spark.sql.sources.DataSourceRegister的自定义实现的完全限定的类名。
如果省略
USING,则默认值为DELTA。对于除
DELTA之外的任何data_source,还必须指定LOCATION,除非表目录为hive_metastore。支持使用
HIVE创建 Hive SerDe 表。 你可以使用OPTIONS子句指定 Hive 特定的file_format和row_format,这是不区分大小写的字符串映射。option_keys为:FILEFORMATINPUTFORMATOUTPUTFORMATSERDEFIELDDELIMESCAPEDELIMMAPKEYDELIMLINEDELIM
table_clauses
可选择指定新表的位置、分区、群集、选项、注释和用户定义的属性。 每个子子句只能指定一次。
-
用于按列子集对表进行分区的可选子句。
注意
除非定义 Delta Lake 表分区列,否则引用列规范中的列总是移动到表的末尾。
clustered_by_clause
可选择使用列子集将表或每个分区聚集到固定数量的哈希桶中。
Delta Lake 表不支持群集功能。
CLUSTERED BY
指定列集,用于聚集每个分区,如果未指定任何分区,则用于聚集表。
-
引用表中
column_identifier的标识符。 如果指定多列,则不能有重复项。 由于群集在分区级别进行操作,因此不能将分区列同时命名为群集列。
-
SORTED BY
可选择保留桶中的行的排序顺序。
sort_column
用于对桶进行排序的列。 该列不能为分区列。 排序列必须是唯一的。
ASC 或 DESC
可选择指定是按升序 (
ASC) 还是降序 (DESC) 对sort_column进行排序。 默认值为ASC。
INTO num_buckets BUCKETS
一个整数文本,用于指定将每个分区(或表 [如果未指定任何分区])划分到的桶数目。
LOCATION path [ WITH ( CREDENTIAL credential_name ) ]
用于存储表数据的可选目录路径,可以是分布式存储上的一个路径。
path必须是字符串字面量。 如果未指定位置,则会将表视为managed table,并且 Azure Databricks 会创建默认表位置。指定位置会使表成为
external table。对于未驻留在
hive_metastore目录中的表(表path),必须由外部位置保护,除非指定了有效的存储凭据。对于 Delta Lake 表,如果存在数据,则表配置继承自
LOCATION。 因此,如果为 Delta Lake 表指定了任何TBLPROPERTIES、column_specification或PARTITION BY子句,则它们必须与 Delta Lake 位置数据完全匹配。-
设置或重置一个或多个用户定义的表选项。
COMMENT table_comment
用于描述表的字符串字面量。
-
可以选择设置一个或多个用户定义的属性。
-
AS 查询
此可选子句使用
query中的数据来填充表。 指定query时,不能同时指定column_specification。 表架构将派生自查询。请注意,Azure Databricks 会用输入查询的数据覆盖基础数据源,确保创建的表包含与输入查询完全相同的数据。
示例
-- Creates a Delta table
> CREATE TABLE student (id INT, name STRING, age INT);
-- 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 '/mnt/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));