CREATE TABLE [USING]

適用於:檢查標示為是 Databricks SQL 檢查標示為是 Databricks Runtime

選擇性地使用數據源定義 Managed 或 外部數據表

語法

{ { [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 |
    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 無法與 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 數據表才支援這個子句。

    • 產生的 ALWAYS AS ( expr

      當您指定這個子句時,這個資料列的值取決於指定的 expr

      expr 可能包含常值、數據表中的數據行標識符,以及具決定性的內建 SQL 函數或運算符,但除外:

      expr 不得包含任何 子查詢

    • GENERATED { ALWAYS |依預設 } 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 識別數據行

      注意

      在 Delta 數據表上宣告識別數據行會停用並行交易。 只有在不需要同時寫入目標數據表的情況下,才使用識別數據行。

    • DEFAULT default_expression

      適用於:檢查標示為是 Databricks SQL 檢查標示為是 Databricks Runtime 11.3 LTS 和更新版本

      DEFAULT定義在、 UPDATEMERGE ... INSERT 和上INSERT未指定資料行時所使用的數據行值。

      如果未針對可為 Null 的資料列套 DEFAULT NULL 用預設值, 則為 。

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

      default_expression 不得包含任何 子查詢

      DEFAULT 支援 CSVJSONPARQUETORC 來源。

    • 批注column_comment

      描述數據行的字串常值。

    • column_constraint

      重要

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

      將主鍵或外鍵條件約束加入 Delta Lake 數據表中的數據行。

      目錄中的數據表 hive_metastore 不支持條件約束。

      若要將檢查條件約束新增至 Delta Lake 數據表,請使用 ALTER TABLE

    • MASK 子句

      適用於:檢查標示為是Databricks SQL 檢查標示為是 Databricks Runtime 12.2 LTS 和更新版本檢查標示為是僅限 Unity 目錄

      重要

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

      新增數據行遮罩函式來匿名敏感數據。 該數據行的所有未來查詢都會收到評估該函式的結果,而該數據行會取代數據行的原始值。 這適用於細部訪問控制用途,其中函式可以檢查叫用使用者的身分識別和/或群組成員資格,以決定是否要修改值。

    • table_constraint

      將參考主鍵或參考外鍵條件約束新增至 Delta Lake 數據表。

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

      若要將檢查條件約束新增至 Delta Lake 數據表,請使用 ALTER TABLE

  • 使用data_source

    要用於數據表的檔案格式。 data_source 必須是下列其中一項:

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

    Databricks Runtime 支援下列用於數據表的其他檔案格式:

    • JDBC
    • LIBSVM
    • 自定義實 org.apache.spark.sql.sources.DataSourceRegister作的完整類別名稱。

    如果 USING 省略 ,則預設值為 DELTA

    data_sourceDELTA除非您的資料表目錄是 hive_metastore,否則您也必須指定 LOCATION

    下列適用於: Databricks Runtime

    HIVE 支援在 Databricks Runtime 中建立 Hive SerDe 數據表。 您可以指定 Hive 特定的 file_format ,並使用 row_formatOPTIONS 子句,這是不區分大小寫的字串對應。 option_keys為:

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

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

    • 數據分割者

      選擇性子句,可依數據行子集分割數據表。

      注意

      如果您未定義 Delta 資料表,即使資料行規格稍早定義數據行,資料分割數據行也會放在數據表結尾。 請考慮使用 CLUSTER BY 而非 PARTITIONED BY Delta 數據表。

    • CLUSTER BY

      適用於: 檢查標示為是 Databricks SQL 檢查標示為是 Databricks Runtime 13.3 和更新版本

      依數據行子集將 Delta 資料表叢集的選擇性子句。 若要叢集其他資料表,請使用 clustered_by_clause

      Delta Lake liquid clustering 無法與 PARTITIONED BY結合。

    • clustered_by_clause

      選擇性地使用數據行子集,將數據表或每個分割區叢集成固定數目的哈希值區。

      Delta Lake 數據表不支援叢集。

      • 叢集依據

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

        • cluster_column

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

      • 排序依據

        選擇性地維護貯體中數據列的排序順序。

        • sort_column

          排序貯體依據的數據行。 數據行不得為數據分割數據行。 排序數據行必須是唯一的。

        • ASCDESC

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

      • INTO num_buckets BUCKETS

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

    • 位置路徑 [ WITH ( CREDENTIAL credential_name ) ]

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

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

      對於不在目錄中的hive_metastore數據表path,除非指定有效的記憶體認證,否則數據表必須受到外部位置的保護。

      您無法在與 Managed 資料表位置重疊的位置 中建立外部資料表

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

    • OPTIONS

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

    • 批注table_comment

      描述數據表的字串常值。

    • TBLPROPERTIES

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

    • WITH ROW FILTER 子句

      適用於:檢查標示為是Databricks SQL 檢查標示為是 Databricks Runtime 12.2 LTS 和更新版本檢查標示為是僅限 Unity 目錄

      重要

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

      將數據列篩選函式加入至數據表。 該數據表的所有未來查詢都會接收其數據列的子集,而此數據列會評估為布爾值 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 '/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));