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 |
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
。-
要建立的資料表的名稱。 名稱不得包含 時態規格或選項規格。 如果名稱不合格,則會在目前的結構描述中建立資料表。
在
hive_metastore
中建立的資料表只能包含英數字元 ASCII 字元和底線 (INVALID_SCHEMA_OR_RELATION_NAME)。 table_specification
此選擇性子句會定義資料行清單、其類型、屬性、描述和資料行條件約束。
如果您未定義資料表結構描述的資料列,則必須指定
AS query
或LOCATION
。-
資料行的唯一名稱。
沒有資料行對應屬性 (
'delta.columnMapping.mode' = 'name'
) 之 Delta Lake 資料表的資料行識別碼不得包含空格或下列字元:, ; { } ( ) \n \t =
。AVRO
資料表的資料行識別碼必須以底線 (_
) 或 Unicode 字母 (包括非 ASCII 字母) 開頭,後面為 Unicode 字母、數位和底線的組合。 -
指定資料行的資料類型。 並非所有資料來源都支援 Azure Databricks 支援的所有資料類型。
NOT NULL
如果已指定,資料行將不會接受
NULL
值。 Delta Lake 資料表僅支援此子句。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 和更新版本
未指定資料行時,定義
INSERT
、UPDATE
和MERGE ... INSERT
上所使用資料行的DEFAULT
值。如果未指定預設值,可為 Null 的資料行會套用
DEFAULT NULL
。default_expression
可能由常值和內建 SQL 函式或運算子組成,但下列函式除外:default_expression
也不得包含任何子查詢。CSV
、JSON
、PARQUET
和ORC
來源支援DEFAULT
。COMMENT column_comment
描述資料行的字串常值。
-
將主索引鍵或外部索引鍵條件約束加入 Delta Lake 資料表中的資料行。
hive_metastore
目錄中的資料表不支持條件約束。若要將 CHECK 條件約束新增至 Delta Lake 資料表,請使用 ALTER TABLE。
-
適用於:Databricks SQL Databricks Runtime 12.2 LTS 和更新版本 僅限 Unity Catalog
重要
這項功能處於公開預覽狀態。
新增資料行 mask 函式來匿名敏感性資料。 該資料行的所有後續查詢都會收到針對資料行中該函式的評估結果,而不是該資料行的原始值。 這適用於更細緻的存取控制,其中函式可以檢查叫用使用者的身分識別和/或群組成員資格,以決定是否要修訂該值。
-
將資訊主索引鍵或資訊外部索引鍵條件約束新增至 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 資料表。 您可以使用OPTIONS
子句來指定特定於 Hive 的file_format
和row_format
,它是不區分大小寫的字串對應。option_keys
為:FILEFORMAT
INPUTFORMAT
OUTPUTFORMAT
SERDE
FIELDDELIM
ESCAPEDELIM
MAPKEYDELIM
LINEDELIM
table_clauses
選擇性地指定新資料表的位置、資料分割、叢集、選項、註解和使用者定義的屬性。 每個次子句只能指定一次。
-
選擇性子句可依資料行子集分割資料表。
注意
如果您未定義 Delta 資料表,分割資料行會放在資料表結尾,即使之前已在資料行規格中定義它們。 對於 Delta 資料表,請考慮使用
CLUSTER BY
而非PARTITIONED BY
。 -
適用於: Databricks SQL Databricks Runtime 13.3 和更新版本
依資料行子集將 Delta 資料表叢集化的可選子句。 若要叢集化其他資料表,請使用
clustered_by_clause
。Delta Lake 液態叢集無法與
PARTITIONED BY
結合。 clustered_by_clause
選擇性地使用資料行子集,將資料表或每個分割區叢集成固定數目的雜湊貯體。
Delta Lake 資料表不支援叢集。
CLUSTERED BY
指定要將每個資料分割叢集化所依據的資料行集,如果未指定任何資料分割,則為資料表。
-
在資料表中參考
column_identifier
的識別碼。 如果指定多個資料行,則不能有重複項。 由於叢集在資料分割層級上運作,因此您不得將分割資料行命名為叢集資料行。
-
SORTED BY
選擇性地維護貯體中資料列的排序順序。
sort_column
對貯體排序所依據的資料行。 資料行不得為分割資料行。 排序資料行必須是唯一的。
ASC 或 DESC
選擇性地指定
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 資料表指定了任何TBLPROPERTIES
、table_specification
或PARTITIONED BY
子句,它們必須完全符合 Delta Lake 位置資料。-
設定或重設一個或多個使用者定義的資料表選項。
COMMENT table_comment
描述資料表的字串常值。
-
選擇性地設定一個或多個使用者定義的屬性。
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 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;