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
。-
要建立之數據表的名稱。 名稱不得包含 時態規格或選項規格。 如果名稱不合格,則會在目前的架構中建立數據表。
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 數據表才支援這個子句。COLLATE collation_name
適用於: Databricks Runtime 16.1 和更高版本
針對
STRING
column_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
值以用於INSERT
、UPDATE
和MERGE ... INSERT
上的數據行。如果未指定預設值,
DEFAULT NULL
會套用於可為 Null 的欄。default_expression
可能由常值和內建 SQL 函式或運算子組成,但下列函式除外:default_expression
也不得包含任何子查詢。DEFAULT
、CSV
、JSON
和PARQUET
來源支援ORC
。COMMENT column_comment
描述列的字符串文本。
-
將主鍵或外鍵約束加入 Delta Lake 表格中的欄位。
hive_metastore
目錄中的數據表不支持條件約束。若要將檢查條件約束新增至 Delta Lake 資料表,請使用 ALTER TABLE。
-
適用於: Databricks SQL Databricks Runtime 12.2 LTS 和更新版本, Unity Catalog 目錄
重要
這項功能處於公開預覽狀態。
新增數據行遮罩函式來匿名敏感數據。 該列的所有後續查詢都會接收將該函式應用於該列後的結果,取代該列的原始值。 這對於精細訪問控制用途很有用,其中函式可以檢查叫用使用者的身分識別或群組成員資格,以決定是否要修改值。
-
將資訊性主鍵或資訊性外鍵約束新增至 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_format
和OPTIONS
,它是不區分大小寫的字串對應。option_keys
為:FILEFORMAT
INPUTFORMAT
OUTPUTFORMAT
SERDE
FIELDDELIM
ESCAPEDELIM
MAPKEYDELIM
LINEDELIM
table_clauses
選擇性地指定新資料表的位置、資料分割、叢集、選項、批注和使用者定義屬性。 每個次子句只能指定一次。
-
選擇性子句,可依部分欄位分割數據表。
注意
如果您未定義 Delta 資料表,分區欄位將會被放置在資料表的結尾,即使它們在資料行規格中已經先行定義。 請考慮使用
CLUSTER BY
,而不是針對 Delta 數據表使用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 目錄
將數據列篩選函式加入至數據表。 從該數據表進行的所有後續查詢將會獲取函式評估為布爾值為真的行的子集。 這對於精細訪問控制用途很有用,其中函式可以檢查叫用使用者的身分識別或群組成員資格,以決定是否要篩選特定數據列。
-
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;