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
不允許。-
要建立之數據表的名稱。 名稱不得包含 時態規格。 如果名稱不合格,則會在目前的架構中建立數據表。
在 中
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 數據表才支援這個子句。產生的 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
定義在、UPDATE
MERGE ... INSERT
和上INSERT
未指定資料行時所使用的數據行值。如果未針對可為 Null 的資料列套
DEFAULT NULL
用預設值, 則為 。default_expression
可能由常值和內建 SQL 函式或運算子組成,但下列情況除外:也
default_expression
不得包含任何 子查詢。DEFAULT
支援CSV
、JSON
、PARQUET
和ORC
來源。批注column_comment
描述數據行的字串常值。
-
重要
這項功能處於公開預覽狀態。
將主鍵或外鍵條件約束加入 Delta Lake 數據表中的數據行。
目錄中的數據表
hive_metastore
不支持條件約束。若要將檢查條件約束新增至 Delta Lake 數據表,請使用 ALTER TABLE。
-
適用於:Databricks SQL Databricks Runtime 12.2 LTS 和更新版本僅限 Unity 目錄
重要
這項功能處於公開預覽狀態。
新增數據行遮罩函式來匿名敏感數據。 該數據行的所有未來查詢都會收到評估該函式的結果,而該數據行會取代數據行的原始值。 這適用於細部訪問控制用途,其中函式可以檢查叫用使用者的身分識別和/或群組成員資格,以決定是否要修改值。
-
將參考主鍵或參考外鍵條件約束新增至 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_source
DELTA
除非您的資料表目錄是hive_metastore
,否則您也必須指定LOCATION
。下列適用於: Databricks Runtime
HIVE
支援在 Databricks Runtime 中建立 Hive SerDe 數據表。 您可以指定 Hive 特定的file_format
,並使用row_format
OPTIONS
子句,這是不區分大小寫的字串對應。option_keys
為:FILEFORMAT
INPUTFORMAT
OUTPUTFORMAT
SERDE
FIELDDELIM
ESCAPEDELIM
MAPKEYDELIM
LINEDELIM
table_clauses
選擇性地指定新資料表的位置、資料分割、叢集、選項、批注和使用者定義屬性。 每個子子句只能指定一次。
-
選擇性子句,可依數據行子集分割數據表。
注意
如果您未定義 Delta 資料表,即使資料行規格稍早定義數據行,資料分割數據行也會放在數據表結尾。 請考慮使用
CLUSTER BY
而非PARTITIONED BY
Delta 數據表。 -
適用於: Databricks SQL Databricks Runtime 13.3 和更新版本
依數據行子集將 Delta 資料表叢集的選擇性子句。 若要叢集其他資料表,請使用
clustered_by_clause
。Delta Lake liquid clustering 無法與
PARTITIONED BY
結合。 clustered_by_clause
選擇性地使用數據行子集,將數據表或每個分割區叢集成固定數目的哈希值區。
Delta Lake 數據表不支援叢集。
叢集依據
指定要將每個資料分割叢集的數據行集,如果未指定任何數據分割,則指定數據表。
-
參考
column_identifier
數據表中的識別碼。 如果您指定多個數據行,則不一定有重複專案。 由於叢集在分割層級上運作,因此您不得將分割區數據行命名為叢集數據行。
-
排序依據
選擇性地維護貯體中數據列的排序順序。
sort_column
排序貯體依據的數據行。 數據行不得為數據分割數據行。 排序數據行必須是唯一的。
ASC 或 DESC
選擇性地指定是以
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 數據表指定了任何TBLPROPERTIES
、table_specification
或PARTITIONED BY
子句,它們必須完全符合 Delta Lake 位置數據。-
設定或重設一或多個使用者定義的數據表選項。
批注table_comment
描述數據表的字串常值。
-
選擇性地設定一或多個使用者定義的屬性。
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));