共用方式為


CREATE TABLE [使用中]

適用於:已勾選為是 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 |
    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之前。

參數

  • 取代

    如果指定,則會取代數據表及其內容,如果已經存在的話。 只有 Delta 和 Apache Iceberg 數據表才支援這個子句。

    REPLACE 保留 表格歷程記錄 和授與的權限、列過濾器和欄遮罩。

    注意

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

  • 外部

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

  • 如果不存在

    如果指定且具有相同名稱的數據表已經存在,則會忽略 語句。

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

  • table_name

    要建立之數據表的名稱。 名稱不得包含 時態規格或選項規格。 如果名稱不合格,則會在目前的架構中建立數據表。

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

    Iceberg 數據表必須在 Unity 目錄中建立。 在hive_metastore中不支援建立 Iceberg 表格。

  • 表格規格

    這個選擇性子句會定義數據行清單、其類型、屬性、描述和數據行條件約束。

    如果您未定義資料表架構的欄位,則必須指定 AS queryLOCATION

    • column_identifier

      欄位的唯一名稱。

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

      表格的 AVRO 欄位識別符號必須以底線(_)或 Unicode 字母(包括非 ASCII 字母)開頭,接著是 Unicode 字母、數字和底線的組合。

      數據表的數據 ICEBERG 行標識碼必須是唯一、不區分大小寫,並遵循標準 SQL 標識符規則。 避免使用空格或特殊字元,因為所有查詢引擎都可能不支持這些字元。

    • 欄位類型

      指定數據行的數據類型。 並非所有數據源都支援 Azure Databricks 支援的所有 數據類型

    • 非空

      如果指定,則數據行不接受 NULL 值。 只有 Delta 和 Iceberg 數據表才支援這個子句。

    • 定序 collation_name

      適用於:已核取為是 Databricks SQL 已核取為是 Databricks Runtime 16.1 和更新版本

      針對 STRINGcolumn_type 可選擇性地指定排序規則,以在此欄位上套用比較和排序操作。 預設排序規則是資料表 default_collation_name

    • 產生的 ALWAYS AS ( expr

      當您指定這個子句時,這個欄位的值取決於指定的 expr

      資料表的 DEFAULT COLLATION 必須 UTF8_BINARY

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

      expr 不得包含任何 子查詢

    • GENERATED { ALWAYS |依預設 } 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 預設表達式

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

      當數據行未指定時,定義 DEFAULT 值以用於 INSERTUPDATEMERGE ... INSERT 上的數據行。

      如果未指定預設值,DEFAULT NULL 會套用於可為 Null 的欄。

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

      default_expression 不得包含任何 子查詢

      DEFAULT 支援 CSVJSONPARQUETORC 來源。

    • 批注column_comment

      描述列的字符串文本。

    • column_constraint

      將主鍵或外鍵約束加入數據表中的欄位。

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

      若要將檢查條件約束新增至資料表,請使用 ALTER TABLE

    • MASK 子句

      適用於:選取標記為是 Databricks SQL 選取標記為是 Databricks Runtime 12.2 LTS 及以上版本 選取標記僅限於 Unity Catalog

      新增數據行遮罩函式來匿名敏感數據。 該列的所有後續查詢都會接收將該函式應用於該列所得到的結果,取代該列的原始值。 這對於精細訪問控制用途很有用,其中函式可以檢查叫用使用者的身分識別或群組成員資格,以決定是否要修改值。

      如果您要取代表格,且新表格包含與原始資料表相同的資料行名稱,則會保留任何現有的資料行遮罩,即使未明確重新定義它們也一樣。 這可防止意外遺失資料存取原則。

    • 資料表限制

      將參考主鍵或參考外鍵條件約束加入至數據表。

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

      若要將檢查條件約束新增至資料表,請使用 ALTER TABLE

  • 使用「data_source」

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

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

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

    對於任何檔案格式,除了DELTAICEBERG,您也必須指定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

    Databricks Runtime 支援使用 HIVE 建立 Hive SerDe 資料表。 您可以使用 file_format 子句來指定 Hive 特定的 row_formatOPTIONS,這是一種不區分大小寫的字串映射。 option_keys 為:

    • FILEFORMAT
    • INPUTFORMAT
    • OUTPUTFORMAT
    • SERDE
    • FIELDDELIM
    • ESCAPEDELIM
    • MAPKEYDELIM
    • LINEDELIM
  • 表格條款

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

    • 按...分區

      選擇性子句,可依部分欄位分割數據表。

      注意

      針對受控 Iceberg 資料表,Azure Databricks 不支援 PARTITIONED BY。 請改用液體叢集 (CLUSTER BY) 來優化數據配置。 針對 Delta 資料表,如果您省略資料表定義,Azure Databricks 會將分割區欄位放在資料表結尾,即使您稍早在資料行規格中列出這些欄位也一樣。

    • CLUSTER BY

      適用於:已核可 Databricks SQL 已核可 Databricks Runtime 13.3 和以上版本

      使用選用的子句將 Delta 或 Iceberg 數據表依行的子集進行叢集。 請參閱 針對數據表使用液體叢集。 若要叢集其他資料表,請使用 clustered_by_clause

      對於 Iceberg 資料表,當您使用 CLUSTER BY時,您必須明確停用刪除向量和數據列標識碼。

      搭配使用 CLUSTER BY AUTO自動液體叢集,Databricks 會智慧地選擇叢集索引鍵,以優化查詢效能。

      您無法將液體群集與 PARTITIONED BY結合。

    • 群集依據子句

      選擇性地使用列子集將數據表或每個分割區叢集到固定數目的哈希桶中。

      Delta 或 Iceberg 數據表不支持這個子句。 請改用 CLUSTER BY

      • 按叢集排序

        指定用來叢集每個資料分區的欄位集,若未指定資料分區,則對整個資料表進行叢集。

        • cluster_column

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

      • 排序依據

        可選擇性地維持分桶中資料列的排序順序。

        • sort_column

          排序桶依據的欄位。 此欄位不得為分割欄位。 排序欄必須是唯一的。

        • ASCDESC

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

      • 進入num_buckets桶

        INTEGER 常值,指定將每個資料分割(或在未指定資料分割時,為整個數據表)分成多少個桶。

    • LOCATION path [ WITH ( CREDENTIAL credential_name ) ]

      儲存表格資料的目錄的選擇性路徑,此路徑可能在分散式儲存上。 path 必須是字串常值。 如果您未指定任何位置,數據表會被視為 managed table,而 Azure Databricks 會建立預設數據表位置。

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

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

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

      對於 Delta 數據表,如果數據已存在於該路徑,數據表就會從 LOCATION 繼承其組態。 因此,任何指定的 TBLPROPERTIEStable_specificationPARTITIONED BY 子句必須完全符合 Delta 位置的現有數據。

      Iceberg 數據表不支援 LOCATION 子句。 當您建立外部目錄時,會自動註冊外部 Iceberg 數據表,而且您必須建立 Managed Iceberg 數據表,而不需指定位置。

    • 選項

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

    • 註解 table_comment

      用於描述表的字串字面值。

    • TBLPROPERTIES

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

    • 預設排序 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

      將數據列篩選函式加入至數據表。 從該數據表進行的所有後續查詢將會獲取函式評估為布爾值為真的行的子集。 這對於精細訪問控制用途很有用,其中函式可以檢查叫用使用者的身分識別或群組成員資格,以決定是否要篩選特定數據列。

      如果您要取代資料表,則會保留任何現有的資料列篩選器,即使它們未明確重新定義也一樣。 這可防止意外遺失資料存取原則。

  • 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
> CREATE TABLE IF NOT EXISTS ora_tab
  USING ORACLE
  OPTIONS (
    url '<jdbc-url>',
    dbtable '<table-name>',
    user '<username>',
    password '<password>'
);

> SELECT * FROM ora_tab;