创建表 [USING]

适用于:勾选“是” Databricks SQL 勾选“是” Databricks Runtime

定义托管表、临时 表或外部表,对于非临时表,可以选择使用数据源。

该 CREATE TEMP TABLE 命令创建一个会话本地临时表,用于在会话期间临时保存数据。 表名必须不限定(无架构或目录前缀)。 临时表不驻留在当前架构或目录中,只能在创建临时表的会话中访问。 Databricks 在会话结束时自动删除临时表。

Important

设置携带凭据的表选项(如密码或令牌)以使其安全时,请使用 secret 函数提供值,而不是直接在子句中 OPTIONS 输入文本值。 这样,便可以引用存储在 Databricks 机密服务 中的机密,而不是在语句中包含凭据值。 请参阅 示例。

语法

{ { [CREATE OR] REPLACE { TEMP | TEMPORARY } TABLE | CREATE [EXTERNAL] TABLE [ IF NOT EXISTS ] | CREATE { TEMP | TEMPORARY } TABLE}
  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 处的文件。

  • TEMP 或 TEMPORARY

    适用于:检查标记为“是”的 Databricks SQL 检查标记为“是”的 Databricks Runtime 18.1 及更高版本

    如果指定,它将创建或替换临时表。 创建或替换临时表时,请勿在 USING 子句或 LOCATION 子句中指定数据源。 不支持以下子句: PARTITIONED BYCLUSTER BY和行级筛选器。 不支持以下列属性: GENERATED 和列掩码。

    对于 REPLACE 命令,如果未 TEMPORARY 指定关键字,该命令只会替换永久表。 如果存在具有相同非限定名称的临时表,则会生成错误 TEMP_TABLE_REPLACE_PERMANENT_NAME_CONFLICT 。

  • 如果不存在

    如果指定了该参数,并且已存在名称相同的表,则会忽略该语句。

    IF NOT EXISTS 无法与 REPLACE 共存,这意味着不允许使用 CREATE OR REPLACE TABLE IF NOT EXISTS。

  • table_name

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

    hive_metastore 中创建的表只能包含字母数字 ASCII 字符和下划线 (INVALID_SCHEMA_OR_RELATION_NAME)。

    必须在 Unity Catalog 中创建 Iceberg 表。 不支持在hive_metastore中创建 Iceberg 表。

创建临时表时,请使用非限定名称(无目录或架构)。 如果临时表或视图的名称与永久对象相同,则非限定名称引用临时对象。 使用包含目录或架构的限定名称访问永久对象。 有关详细信息,请参阅 表和视图分辨率 。

  • 表格规范

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

    如果未在表架构中定义列,则必须指定 AS query 或 LOCATION。

    • column_identifier

      列的唯一名称。

      不包含列映射属性 ('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

      对于 STRINGcolumn_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

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

    • column_constraint

      将主键或外键约束添加到表中的列。

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

      若要向表添加检查约束,请使用 ALTER TABLE。

    • MASK 子句

      适用于:勾选“是” Databricks SQL 勾选“是” Databricks Runtime 12.2 LTS 及更高版本 勾选“是” 仅 Unity Catalog

      添加列掩码函数以对敏感数据进行匿名化处理。 该列的所有后续查询将会收到对该列计算该函数(而不是该列的原始值)的结果。 这对于细粒度的访问控制目的非常有用,在这种情况下,该函数可以检查调用用户的身份或组成员身份,以便决定是否编辑该值。

      如果要替换表,并且新表包含与原始表相同的列名称,则保留任何现有列掩码,即使它们未显式重新定义。 这可以防止意外丢失数据访问策略。

    • table_constraint

      向表添加信息性主键或信息性外键约束。

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

      若要向表添加检查约束,请使用 ALTER TABLE。

  • 使用data_source

    data_source 可以是文件格式,也可以是联合 JDBC 数据源。

    文件格式必须是以下之一:

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

    对于除任何文件格式以外的DELTAICEBERG任何文件格式,如果未指定LOCATION或AS query指定,则表将创建为不包含数据的托管表。

    支持以下联合 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。

    临时表不支持该 USING 子句。

    以下内容适用于: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

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

    • PARTITIONED BY

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

      临时表不支持该 PARTITIONED BY 子句。

      注意

      对于托管的 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

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

        • cluster_column

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

          临时表不支持该 CLUSTERED BY 子句。

      • 排序依据

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

        • 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_specificationPARTITIONED BY子句必须完全匹配 Delta 位置的现有数据。

      对于 Iceberg 表,不支持该 LOCATION 子句。 当你创建外部目录时,外部 Iceberg 表会自动注册,并且必须创建托管 Iceberg 表,无需指定位置。

      临时表不支持该 LOCATION 子句。

    • 选项

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

    • COMMENT table_comment

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

    • TBLPROPERTIES

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

    • 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 的行的子集。 这对于细粒度的访问控制目的非常有用,在这种情况下,该函数可以检查调用用户的身份或组成员身份,以决定是否筛选特定行。

      如果要替换表,则保留任何现有行筛选器,即使它们未显式重新定义。 这可以防止意外丢失数据访问策略。

      临时表不支持该 ROW FILTER 子句。

  • 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.
-- Provide the user and password using the secret function rather than
-- entering them directly.
> CREATE TABLE IF NOT EXISTS ora_tab
  USING ORACLE
  OPTIONS (
    url '<jdbc-url>',
    dbtable '<table-name>',
    user secret('secrets.r.us', 'oracleUser'),
    password secret('secrets.r.us', 'oraclePassword')
);

> SELECT * FROM ora_tab;

-- Create a temporary table, insert values in it, and display its contents.
> CREATE TEMP TABLE temp_1 (a INT);
> INSERT INTO temp_1 VALUES (1);
> SELECT * FROM temp_1;
  a
  ----
  1

> CREATE OR REPLACE TEMP TABLE temp_1 (a VARCHAR(100));
> DESCRIBE TABLE temp_1;
colName     dataType
-------     --------
      a   varchar(100)