共用方式為


CREATE TABLE [USING]

適用於:核取記號為「是」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 |
    WITH { ROW FILTER clause } } [...]

clustered_by_clause
  { CLUSTERED BY ( cluster_column [, ...] )
    [ SORTED BY ( { sort_column [ ASC | DESC ] } [, ...] ) ]
    INTO num_buckets BUCKETS }

參數

  • REPLACE

    如果已指定,則會取代資料表及其內容,如果已經存在的話。 Delta Lake 資料表僅支援此子句。

    REPLACE 會保留資料表歷史記錄

    注意

    Azure Databricks 強烈建議使用 REPLACE,而不是卸除和重新建立 Delta Lake 資料表。

  • EXTERNAL

    如果已指定,請建立外部資料表。 建立外部資料表時,也必須提供 LOCATION 子句。 卸除外部資料表時,將不會卸除位於 LOCATION 的檔案。

  • IF NOT EXISTS

    如果已指定且具有相同名稱的資料表已經存在,則會忽略陳述式。

    IF NOT EXISTS 無法與 REPLACE 共存,這表示不允許 CREATE OR REPLACE TABLE IF NOT EXISTS

  • table_name

    要建立的資料表的名稱。 名稱不得包含 時態規格或選項規格。 如果名稱不合格,則會在目前的結構描述中建立資料表。

    hive_metastore 中建立的資料表只能包含英數字元 ASCII 字元和底線 (INVALID_SCHEMA_OR_RELATION_NAME)。

  • table_specification

    此選擇性子句會定義資料行清單、其類型、屬性、描述和資料行條件約束。

    如果您未定義資料表結構描述的資料列,則必須指定 AS queryLOCATION

    • column_identifier

      資料行的唯一名稱。

      沒有資料行對應屬性 ('delta.columnMapping.mode' = 'name') 之 Delta Lake 資料表的資料行識別碼不得包含空格或下列字元:, ; { } ( ) \n \t =

      AVRO 資料表的資料行識別碼必須以底線 (_) 或 Unicode 字母 (包括非 ASCII 字母) 開頭,後面為 Unicode 字母、數位和底線的組合。

    • column_type

      指定資料行的資料類型。 並非所有資料來源都支援 Azure Databricks 支援的所有資料類型

    • NOT NULL

      如果已指定,資料行將不會接受 NULL 值。 Delta Lake 資料表僅支援此子句。

    • COLLATE collation_name

      適用於:勾選為是 Databricks Runtime 16.1 和更高版本

      選擇性地為 STRINGcolumn_type 命名定序,以在此欄位上套用比較和排序作業。 預設定序為 UTF8_BINARY

    • GENERATED ALWAYS AS ( expr )

      當您指定此子句時,資料行的值取決於指定的 expr

      expr 可能由常值、資料表內的資料行識別碼以及確定性內建 SQL 函式或運算子組成,但下列函式除外:

      expr 也不得包含任何子查詢

    • GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY [ ( [ START WITH start ] [ INCREMENT BY step ] ) ]

      適用於:核取記號為「是」 Databricks SQL 核取記號為「是」 Databricks Runtime 10.4 LTS 和更新版本

      定義識別資料行。 當您寫入資料表,且未提供識別資料行的值時,會自動指派唯一且以統計方式遞增 (如果 step 為負值則遞減) 的值。 Delta Lake 資料表僅支援此子句。 此子句只能用於具有 BIGINT 資料類型的資料行。

      自動指派的值會以 start 開頭,並按 step 遞增。 指派的值是唯一的,但不保證是連續的。 兩個參數都是可選的,預設值為 1。 step 不可以是 0

      如果自動指派的值超出識別資料行類型的範圍,查詢將會失敗。

      使用 ALWAYS 時,您無法提供自己的識別資料行值。

      不支援下列作業:

      • PARTITIONED BY 識別資料行
      • UPDATE 識別資料行

      注意

      在差異資料表上宣告識別資料行會停用並行交易。 僅在不需要對目標資料表進行並行寫入的使用案例中使用識別資料行。

    • DEFAULT default_expression

      適用於:核取記號為「是」 Databricks SQL 核取記號為「是」 Databricks Runtime 11.3 LTS 和更新版本

      未指定資料行時,定義 DEFAULTINSERTUPDATE 上所使用資料行的 MERGE ... INSERT 值。

      如果未指定預設值,可為 Null 的資料行會套用 DEFAULT NULL

      default_expression 可能由常值和內建 SQL 函式或運算子組成,但下列函式除外:

      default_expression 也不得包含任何子查詢

      DEFAULTCSVJSONPARQUET 來源支援 ORC

    • COMMENT column_comment

      描述資料行的字串常值。

    • column_constraint

      將主索引鍵或外部索引鍵條件約束加入 Delta Lake 資料表中的資料行。

      hive_metastore 目錄中的資料表不支持條件約束。

      若要將 CHECK 條件約束新增至 Delta Lake 資料表,請使用 ALTER TABLE

    • MASK 子句

      適用於:核取記號為「是」Databricks SQL 核取記號為「是」 Databricks Runtime 12.2 LTS 和更新版本 核取記號為「是」 僅限 Unity Catalog

      重要

      這項功能處於公開預覽狀態

      新增資料行 mask 函式來匿名敏感性資料。 該資料行的所有後續查詢都會收到針對資料行中該函式的評估結果,而不是該資料行的原始值。 這適用於更細緻的存取控制,其中函式可以檢查叫用使用者的身分識別和/或群組成員資格,以決定是否要修訂該值。

    • table_constraint

      將資訊主索引鍵或資訊外部索引鍵條件約束新增至 Delta Lake 資料表。

      hive_metastore 目錄中的資料表不支援索引鍵條件約束。

      若要將 CHECK 條件約束新增至 Delta Lake 資料表,請使用 ALTER TABLE

  • USING data_source

    data_source 可以是檔格式或同盟 JDBC 數據源。

    檔案格式必須是下列其中一項:

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

    對於以外的 DELTA 任何檔案格式,您也必須指定 , 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_formatOPTIONS,它是不區分大小寫的字串對應。 option_keys 為:

    • FILEFORMAT
    • INPUTFORMAT
    • OUTPUTFORMAT
    • SERDE
    • FIELDDELIM
    • ESCAPEDELIM
    • MAPKEYDELIM
    • LINEDELIM
  • table_clauses

    選擇性地指定新資料表的位置、資料分割、叢集、選項、註解和使用者定義的屬性。 每個次子句只能指定一次。

    • PARTITIONED BY

      選擇性子句可依資料行子集分割資料表。

      注意

      如果您未定義 Delta 資料表,分割資料行會放在資料表結尾,即使之前已在資料行規格中定義它們。 對於 Delta 資料表,請考慮使用 CLUSTER BY 而非 PARTITIONED BY

    • CLUSTER BY

      適用於:核取記號為「是」 Databricks SQL 核取記號為「是」 Databricks Runtime 13.3 和更新版本

      依資料行子集將 Delta 資料表叢集化的可選子句。 若要叢集化其他資料表,請使用 clustered_by_clause

      Delta Lake 液態叢集無法與 PARTITIONED BY 結合。

    • clustered_by_clause

      選擇性地使用資料行子集,將資料表或每個分割區叢集成固定數目的雜湊貯體。

      Delta Lake 資料表不支援叢集。

      • CLUSTERED BY

        指定要將每個資料分割叢集化所依據的資料行集,如果未指定任何資料分割,則為資料表。

        • cluster_column

          在資料表中參考 column_identifier 的識別碼。 如果指定多個資料行,則不能有重複項。 由於叢集在資料分割層級上運作,因此您不得將分割資料行命名為叢集資料行。

      • SORTED BY

        選擇性地維護貯體中資料列的排序順序。

        • sort_column

          對貯體排序所依據的資料行。 資料行不得為分割資料行。 排序資料行必須是唯一的。

        • ASCDESC

          選擇性地指定 sort_column 是以遞增 (ASC) 或遞減 (DESC) 順序排序。 預設值為 ASC

      • INTO num_buckets BUCKETS

        INTEGER 常值,指定分割每個資料分割的貯體數目 (如果沒有指定資料分割,則為資料表)。

    • LOCATION path [ WITH ( CREDENTIAL credential_name ) ]

      儲存資料表資料之目錄的可選路徑,可能是分散式儲存體上的路徑。 path 必須是 STRING 常值。 如果未指定任何位置,則會將資料表視為 managed table,且 Azure Databricks 會建立預設的資料表位置。

      指定位置會使資料表成為外部資料表

      對於不在 hive_metastore 目錄中的資料表,除非指定有效的path,否則資料表 必須受到外部位置的保護。

      無法在與受控資料表位置重疊的位置中建立外部資料表。

      若為 Delta Lake 資料表,資料表組態會繼承自 LOCATION,如果資料存在的話。 因此,如果為 Delta Lake 資料表指定了任何 TBLPROPERTIEStable_specificationPARTITIONED BY 子句,它們必須完全符合 Delta Lake 位置資料。

    • OPTIONS

      設定或重設一個或多個使用者定義的資料表選項。

    • COMMENT table_comment

      描述資料表的字串常值。

    • TBLPROPERTIES

      選擇性地設定一個或多個使用者定義的屬性。

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

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