共用方式為


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 |
    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之前。

參數

  • 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 識別欄位

      注意

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

    • DEFAULT default_expression

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

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

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

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

      default_expression 也不得包含任何子查詢

      DEFAULTCSVJSONPARQUET 來源支援 ORC

    • COMMENT column_comment

      描述列的字符串文本。

    • column_constraint

      將主鍵或外鍵約束加入 Delta Lake 表格中的欄位。

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

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

    • MASK 子句

      適用於:標示為是 Databricks SQL 標示為是 Databricks Runtime 12.2 LTS 和更新版本,標示為是 Unity Catalog 目錄

      重要

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

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

    • table_constraint

      將資訊性主鍵或資訊性外鍵約束新增至 Delta Lake 資料表。

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

      若要將檢查條件約束新增至 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

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

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

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

    • PARTITIONED BY

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

      注意

      如果您未定義 Delta 資料表,分區欄位將會被放置在資料表的結尾,即使它們在資料行規格中已經先行定義。 請考慮使用 CLUSTER BY,而不是針對 Delta 數據表使用 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 目錄

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

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