CREATE TABLE [USING] (Databricks SQL)

可以使用数据源定义托管表或外部表

语法

{ { [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 ] ) ] |
        DEFAULT default_expression ]
      [ 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_name

    要创建的表的名称。 名称不得包含时态规范。 如果未限定该名称,则会在当前架构中创建该表。

  • table_specification

    此可选子句定义列的列表、列的类型、属性、说明和列约束。

    如果未在表架构中定义列,则必须指定 AS queryLOCATION

    • column_identifier

      列的唯一名称。

    • column_type

      指定列的数据类型。 并非所有数据源都支持 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 标识列
    • DEFAULT default_expression

      要求:SQL 仓库版本 2022.30 或更高版本。 此版本在预览通道中提供。

      为列定义一个 DEFAULT 值,当未指定该列时,将在 INSERTUPDATEMERGE ... INSERT 上使用该值。

      如果未指定默认值,则 DEFAULT NULL 应用于可为空的列。

      default_expression 可以由字面量和内置 SQL 函数或运算符组成,但以下情况除外:

      此外,default_expression 不能包含任何default_expression

      CSVJSONPARQUETORC 源支持 DEFAULT

    • COMMENT column_comment

      用于描述列的字符串字面量。

    • column_constraint

      重要

      此功能目前以公共预览版提供。

      向 Delta Lake 表中的列添加主键或外键约束。

      hive_metastore 目录中的表不支持约束。

      若要向 Delta Lake 表添加 CHECK 约束,请使用 ALTER TABLE

    • table_constraint

      向 Delta Lake 表添加主键或外键约束。

      hive_metastore 目录中的表不支持约束。

      若要向 Delta Lake 表添加 CHECK 约束,请使用 ALTER TABLE

  • USING data_source

    将要用于表的文件格式。 data_source 必须是以下各项之一:

    • TEXT
    • AVRO
    • CSV
    • JSON
    • PARQUET
    • ORC
    • DELTA

    如果省略 USING,则默认值为 DELTA

    对于除 DELTA 之外的任何 data_source,还必须指定 LOCATION,除非表目录为 hive_metastore

  • table_clauses

    可选择指定新表的位置、分区、群集、选项、注释和用户定义的属性。 每个子子句只能指定一次。

    • PARTITIONED BY

      用于按列子集对表进行分区的可选子句。

      注意

      除非定义 Delta Lake 表分区列,否则引用列规范中的列总是移动到表的末尾。

    • clustered_by_clause

      可选择使用列子集将表或每个分区聚集到固定数量的哈希桶中。

      Delta Lake 表不支持群集功能。

      • CLUSTERED BY

        指定列集,用于聚集每个分区,如果未指定任何分区,则用于聚集表。

        • cluster_column

          引用表中 column_identifier 的标识符。 如果指定多列,则不能有重复项。 由于群集在分区级别进行操作,因此不能将分区列同时命名为群集列。

      • SORTED BY

        可选择保留桶中的行的排序顺序。

        • sort_column

          用于对桶进行排序的列。 该列不能为分区列。 排序列必须是唯一的。

        • ASCDESC

          可选择指定是按升序 (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 表指定了任何 TBLPROPERTIEScolumn_specificationPARTITION BY 子句,则它们必须与 Delta Lake 位置数据完全匹配。

    • OPTIONS

      设置或重置一个或多个用户定义的表选项。

    • COMMENT table_comment

      用于描述表的字符串字面量。

    • TBLPROPERTIES

      可以选择设置一个或多个用户定义的属性。

  • 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));