Azure Databricks 支援 SQL 標準 DDL 命令,以卸除和取代以 Unity 目錄或 Hive 中繼存放區註冊的數據表。 丟棄與替換的行為會依資料表類型和元儲存庫而異。 選擇正確的指令以避免資料遺失或同時操作失敗。
刪除數據表的時候
Databricks 建議,當您想要永久刪除該資料表,且不打算在相同位置建立新資料表時,使用 DROP TABLE 將該資料表從中繼存放區移除。 例如:
DROP TABLE table_name
DROP TABLE 會根據資料表的類型以及該資料表是註冊在 Unity Catalog 還是舊有的 Hive 中繼儲存庫而有不同的行為。
| 數據表類型 | Metastore | 行為 |
|---|---|---|
| Managed | Unity 目錄 | 數據表會從中繼存放區中移除,而基礎數據會標示為要刪除。 你可以 UNDROP 在設定的恢復期間(預設 7 天)內建立一個受管理的表格。 請參閱 刪除受管理資料表。 |
| Managed | Hive | 數據表會從中繼存放區中移除,並刪除基礎數據。 |
| External | Unity 目錄 | 數據表會從中繼存放區中移除,但基礎數據會維持不變。 URI 訪問許可權現在由包含資料的外部位置控管。 |
| External | Hive | 數據表會從中繼存放區中移除,但基礎數據會維持不變。 任何 URI 訪問許可權都未變更。 |
Unity 目錄會使用內部資料表 ID 來維護資料表的歷史紀錄。 對於所有資料表類型,在刪除作業完成後,先前註冊的資料表名稱不再與中繼資料儲存庫中的資料和資料表歷史記錄保持作用中的連結。
參見 DROP TABLE。
Note
Databricks 不建議您在生產管線或系統中刪除資料表後,再以相同名稱重新建立該資料表,因為這可能會導致並發作業出現非預期的結果。 請參閱 使用並行作業取代數據。
取代數據表的時機
Databricks 建議使用 CREATE OR REPLACE TABLE 語句,以使用您想要以新數據完整覆寫目標數據表的使用案例。 例如,若要覆蓋 Parquet 目錄中所有資料表,請執行以下指令:
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。
你不應該使用以下反模式:
DROP TABLE IF EXISTS table_name;
CREATE TABLE table_name
AS SELECT * FROM parquet.`/path/to/files`;
對於所有資料表類型,不論你是否使用 Unity Catalog,使用這種模式都可能導致錯誤、紀錄遺失或結果損毀。
相反地,Databricks 建議一律使用 CREATE OR REPLACE TABLE,如下列範例所示:
CREATE OR REPLACE TABLE table_name
AS SELECT * FROM parquet.`/path/to/files`
由於原子替換會保留資料表歷史記錄,因此並行交易可以驗證其所參照的來源資料表版本,並在不出現非預期行為的情況下,使並行交易失敗或加以調和。