共用方式為


卸除或取代 Delta 數據表

Azure Databricks 支援 SQL 標準 DDL 命令,以卸除和取代以 Unity 目錄或 Hive 中繼存放區註冊的數據表。 本文提供根據您設定的環境和所需結果,卸除和取代語法的差異數據表和建議的範例。

卸除數據表的時機

當您想要永久刪除資料表,且無意在相同位置中建立新的資料表時,您應該使用 DROP TABLE 從中繼存放區移除資料表。 例如:

DROP TABLE table_name

DROP TABLE 根據數據表的類型以及數據表是否已向 Unity 目錄或舊版 Hive 中繼存放區註冊數據表,具有不同的語意。

資料表類型 Metastore 行為
受控 Unity 目錄 數據表會從中繼存放區中移除,而基礎數據會標示為要刪除。 您可以在 UNDROP Unity 目錄受控資料表中資料 7 天。
受控 Hive 數據表會從中繼存放區中移除,並刪除基礎數據。
外部 Unity 目錄 數據表會從中繼存放區中移除,但基礎數據會維持不變。 URI 訪問許可權現在由包含資料的外部位置控管。
外部 Hive 數據表會從中繼存放區中移除,但基礎數據會維持不變。 任何 URI 訪問許可權都未變更。

DROP TABLE 語意在數據表類型之間有所不同,Unity 目錄會使用內部數據表標識符來維護 Delta 資料表的歷程記錄。 不過,所有數據表都會共享作業完成之後的一般結果,先前註冊的數據表名稱不再具有中繼存放區中數據和數據表歷程記錄的作用中連結。

請參閱 DROP TABLE

注意

Databricks 不建議卸除,然後針對生產管線或系統使用相同的名稱重新建立數據表,因為此模式可能會導致並行作業產生非預期的結果。 請參閱 使用並行作業取代數據。

取代數據表的時機

Databricks 建議使用 CREATE OR REPLACE TABLE 語句,以使用您想要以新數據完整覆寫目標數據表的使用案例。 例如,若要使用 Parquet 目錄中的所有資料覆寫 Delta 資料表,您可以執行下列命令:

CREATE OR REPLACE TABLE table_name
AS SELECT * FROM parquet.`/path/to/files`

CREATE OR REPLACE TABLE 不論使用中的數據表類型或中繼存放區為何,都有相同的語意。 以下是 的重要 CREATE OR REPLACE TABLE優點:

  • 會取代數據表內容,但會維護數據表身分識別。
  • 數據表歷程記錄會保留,而且您可以使用 命令,將數據表還原為舊版 RESTORE
  • 作業是單一交易,因此數據表不存在時永遠不會有時間。
  • 從數據表讀取的並行查詢可以繼續,而不會中斷。 因為取代前後的版本仍然存在於數據表歷程記錄中,因此並行查詢可以視需要參考任一版本的數據表。

請參閱 CREATE TABLE [USING]

以並行作業取代數據

每當您要在可能用於並行作業的資料表中執行完整取代資料時,都必須使用 CREATE OR REPLACE TABLE

不應使用下列反模式:

-- This is an anti-pattern. Avoid doing this!
DROP TABLE IF EXISTS table_name;

CREATE TABLE table_name
AS SELECT * FROM parquet.`/path/to/files`;

此建議的原因會因您使用 Managed 或外部數據表,以及您是否使用 Unity 目錄而有所不同,但使用此模式的所有 Delta 數據表類型都可能會導致錯誤、卸除的記錄或損毀的結果。

相反地,Databricks 建議一律使用 CREATE OR REPLACE TABLE,如下列範例所示:

CREATE OR REPLACE TABLE table_name
AS SELECT * FROM parquet.`/path/to/files`

由於數據表歷程記錄會在不可部分完成的數據取代期間維護,因此並行交易可以驗證所參考源數據表的版本,因此視需要失敗或協調並行交易,而不需要引入非預期的行為或結果。