共用方式為


將外部資料表轉換成受控 Unity 目錄資料表

這很重要

這項功能處於公開預覽狀態,目前僅適用於參與的客戶。 若要參與預覽,請填寫此表格以申請。 此功能僅支援轉換使用 HMS 和 Glue 聯邦的外部資料表。

本頁說明如何使用來 SET MANAGED 將外部資料表轉換為受管理資料表。

SET MANAGED 概觀

使用此功能 SET MANAGED 將外部資料表轉換成 Azure Databricks 中的 Unity 目錄受控資料表。 SET MANAGED 提供下列優點:

  • 保留數據表歷程記錄。
  • 保留相同的數據表組態,包括相同的名稱、設定、許可權和檢視。
  • 受益於 預測優化。 將表格轉換為受管理表格時,預測最佳化會設定為 INHERIT,這表示它會從結構描述或目錄層級繼承設定。 根據預設,目前已停用此功能。 您可以藉由執行 ALTER TABLE <table_name> ENABLE PREDICTIVE OPTIMIZATION,將轉換的表格設定為 ENABLED,啟用預測最佳化,而不是 INHERIT

先決條件

  • 資料格式:外部資料表的資料格式必須是 Delta Lake。 若要執行 Parquet 的一次性轉換,請參閱 轉換為 Delta Lake
  • 表格類型:HMS 表格類型必須是外部 HMS 表格。 如果表格是受管理的 HMS 表格,則指令會失敗。
  • 執行階段:Databricks Runtime 17.3 或更新版本
  • 權限OWNERMANAGE的資料表權限和CREATEEXTERNAL LOCATION的權限

語法

若要將 Unity Catalog 外來資料表轉換成由 Unity Catalog 管理,請執行下列命令:

ALTER TABLE source_table SET MANAGED {MOVE | COPY}

參數

  • source_table

    Unity 目錄中現有的外部資料表。 外部表格包含由外部目錄管理的資料和中繼資料。 在轉換之前,如果您在外部目錄中卸除來源資料表,那麼 Unity Catalog 中的外部資料表也會被卸除。 將資料表轉換成受控資料表之後,卸除外部目錄中的來源資料表不會影響 Unity 目錄受控資料表。

  • MOVE

    將表格轉換為受管理表格,並停用對外部目錄中來源表格的存取。

    • 轉換表格之後,透過外部目錄或依路徑存取將會失敗。 數據表的所有讀取器和寫入器都必須使用 Unity 目錄命名空間進行存取。

    • 所有讀取器和寫入器都必須使用名稱型存取。 例如:

      SELECT * FROM catalog_name.schema_name.table_name;
      
    • 不支援路徑型存取,且在轉換資料表之後會失敗。 例如:

      SELECT * FROM delta.`protocol://path/to/table`;
      
    • 外部 (非 Azure Databricks) 用戶端必須支援讀取 Unity 目錄受控資料表。 請參閱 相容模式

    • 使用 Access Insights 儀表板來查看存取資料表的讀寫操作是否來自 Databricks Runtime 還是其他非 Azure Databricks 的外部客戶端。

    • Azure Databricks 讀取器和寫入器必須使用 Databricks Runtime 15.4 LTS 或更新版本。 如果您的讀取器或寫入器使用 Databricks Runtime 14.3 LTS 或更低版本,請參閱 Databricks Runtime 14.3 LTS 或更低版本上讀取器和寫入器的替代選項

    • 當讀取器或寫入器在轉換期間存取資料表時,可能會發生停機時間。 如需詳細資訊,請參閱 將外部資料表轉換成受控 Unity 目錄資料表

    • 如果您的指令中斷,資料表可能仍然是外部資料表,因為轉換成受管理狀態的過程未完成。 若要完成指令,請在外部表格上重新執行 SET MANAGED

    • 預測最佳化會設定為 , INHERIT 除非您手動設定。 若要檢查是否已啟用預測最佳化,請參閱 檢查是否已啟用預測最佳化

    • 復原:若要復原資料表移轉,並重新取得外部型錄中來源資料表的存取權,請執行命令 UNSET MANAGED 。 執行指令之後,表格會變成外部表格。 若要將表格轉回成外部表格,請刪除該表格,它會在下一次目錄同步中重新設置為外部表格。

      ALTER TABLE catalog.schema.my_managed_table UNSET MANAGED
      

      警告

      您必須在丟棄表格之前執行 UNSET MANAGED 。 在未先執行 UNSET MANAGED 的情況下捨棄表格可能會使您的系統處於不良狀態,並可能導致資料遺失或不一致。

    • 如果您回滾,則在轉換和回滾之間對外部位置所做的提交可依版本追溯,但不能按時間戳記追溯。 復原後 7 天,會刪除受管理位置中的資料。 針對 Databricks Runtime 15.4 LTS 或更新版本中的讀取器和寫入器,轉換後進行的提交,其資料表歷程在復原之前可依版本進行回溯,但不可依時間戳記進行回溯。

    • 表格轉換之後,您必須:

      • 使用外部資料表重新啟動任何串流工作 (讀取或寫入)
      • 確保您的讀取器和寫入器能夠搭配管理的資料表使用。
  • COPY

    將表格轉換為受管理表格,而不修改或停用對外部型錄中來源表格的存取權。

    • 在轉換為受管理表格期間,來源表格中的資料會複製到為外部表格定義的受管理儲存位置,從而建立兩個單獨的副本:外部目錄中的新受管理表格和來源表格。
    • 與讀取和寫入失敗的情況不同 MOVE ,使用 COPY時,您負責正確停用對外部型錄中來源表格的讀取和寫入,並確保工作量已移轉至新型錄。
    • 復原:若要復原表格移轉,您不需要執行指令 UNSET MANAGED ,因為外部型錄中的來源表格尚未中斷。 移除資料表,它會在下一個目錄同步中再次被設為外部表。

檢查轉換

您可以確認外部資料表已轉換成受控資料表:

DESCRIBE EXTENDED catalog_name.schema_name.table_name

如果資料表已轉換,Type 下的 col_name 會顯示為 MANAGED 下的 data_type

已知的限制

將外部資料表轉換為受管理資料表有下列限制:

  • 串流客戶端:轉換之後,您必須重新啟動任何串流作業。

  • 多個雲端區域:如果 Unity 目錄中繼存放區、目錄或結構描述的預設受控位置與要轉換的外部資料表儲存位置位於不同的雲端區域中,則可能會產生額外的跨區域資料傳輸成本。 雲端提供者會在 Azure Databricks 控制之外施加這些費用。 若要檢查結構描述、目錄和中繼存放區的位置,請使用下列命令:

    -- Check schema location
    DESCRIBE SCHEMA EXTENDED catalog_name.schema_name;
    
    -- Check catalog location
    DESCRIBE CATALOG EXTENDED catalog_name;
    
    -- Check metastore location
    DESCRIBE METASTORE;
    

FAQ

我可以在外部目錄中建立表格以及轉換表格嗎?

是,您可以在外部目錄中建立外部或受管理的資料表。 行為取決於結構描述設定:

  • 針對 Glue 或 eHMS 資料結構,或 針對在 Unity 目錄中設定受管理的位置的資料結構:如果您執行 CREATE TABLE foreign_catalog.schema.table,這會建立 Unity 目錄受管理或外部資料表。 表格不會推送或同步至外部型錄。
  • 對於來自內部 Hive 中繼存放區連線的結構描述:如果您嘗試在非本地結構描述中建立資料表,它仍會建立一個非本地資料表,並且同時會在內部結構描述中hive_metastore建立一個資料表。
  • 針對舊版工作區 Hive 中繼存放區:由於它是讀取和寫入同盟,如果您在外部目錄中建立資料表,它也會在內部 Hive 中繼存放區中建立資料表。

如果我的外部資料表是 DBFS 支援的,該怎麼辦?

轉換 DBFS 支援的資料表時,我們會將 DBFS 路徑與雲端路徑的目前對應儲存為外部資料表的雲端路徑位置。

我可以在結構描述或目錄層級進行轉換嗎?

您可以逐一查看結構描述中的表格以單獨轉換,或利用 discoverx labs 專案一次轉換整個結構描述或目錄:

df = (dx.from_tables("prod.*.*")
.with_sql("ALTER TABLE {full_table_name} SET MANAGED;")
.apply())