共用方式為


使用 Iceberg 用戶端讀取 Delta 資料表

本文提供在 Azure Databricks 中以 Delta Lake 儲存的資料表上啟用 Iceberg 讀取功能的詳細資訊。 此功能需要 Databricks Runtime 14.3 LTS 或更新版本。

注意

這項功能先前稱為 Delta Lake Universal Format (UniForm)。

您可以設定外部連線,讓 Unity 目錄作為 Iceberg 目錄。 請參閱 從 Iceberg 用戶端讀取 Databricks 數據表

Iceberg 讀取(UniForm)的工作原理是什麼?

Delta Lake 和 Iceberg 都包含 Parquet 數據檔和元數據層。 啟用 Iceberg 讀取會設定數據表以異步方式自動產生 Iceberg 元數據,而不需要重寫數據,讓 Iceberg 用戶端可以讀取 Azure Databricks 所撰寫的 Delta 數據表。 資料檔案的單一拷貝提供多種格式。

重要

  • 已啟用 Iceberg 讀取的數據表會使用 Zstandard,而不是 Snappy 作為基礎 Parquet 數據檔的壓縮編解碼器。
  • Iceberg 元數據產生會在用來將數據寫入 Delta 數據表的計算上以異步方式執行,這可能會增加驅動程式資源使用量。
  • 如需舊版 UniForm IcebergCompatV1 資料表功能的檔,請參閱 舊版 UniForm IcebergCompatV1

需求

若要啟用 Iceberg 讀取,必須符合下列需求:

注意

您無法在已啟用 Iceberg 讀取的資料表上啟用刪除向量。

使用 REORG 停用和清除刪除向量,同時啟用 Iceberg 讀取已啟用刪除向量的現有數據表。 請參閱 ,使用 REORG來啟用或升級 Iceberg 的讀取支援。

啟用 Iceberg 讀取 (UniForm)

重要

當您啟用 Iceberg 讀取時,會將寫入通訊協定功能 IcebergCompatV2 新增至數據表。 只有支援此數據表功能的用戶端可以寫入已啟用 Iceberg 讀取的數據表。 在 Azure Databricks 上,您必須使用 Databricks Runtime 14.3 LTS 或更新版本來寫入已啟用數據表。

您可以移除 delta.universalFormat.enabledFormats 資料表屬性設定來關閉 Iceberg 讀取。 無法復原對 Delta Lake 讀取器和寫入器通訊協定版本的升級。

您必須設定下表屬性,才能啟用 Iceberg 讀取:

'delta.enableIcebergCompatV2' = 'true'
'delta.universalFormat.enabledFormats' = 'iceberg'

當您第一次啟用 Iceberg 讀取時,異步元數據產生就會開始。 此工作必須先完成,外部用戶端才能使用 Iceberg 查詢數據表。 請參閱檢查 Iceberg 中繼資料產生狀態

如需限制清單,請參閱 限制

在數據表建立期間啟用 Iceberg 讀取

列映射 必須啟用才能使用 Iceberg 讀取。 如果您在建立數據表期間啟用 Iceberg 讀取,就會自動發生此情況,如下列範例所示:

CREATE TABLE T(c1 INT) TBLPROPERTIES(
  'delta.columnMapping.mode' = 'name',
  'delta.enableIcebergCompatV2' = 'true',
  'delta.universalFormat.enabledFormats' = 'iceberg');

啟用 Iceberg 讀取現有數據表

在 Databricks Runtime 15.4 LTS 和更新版本中,您可以使用下列語法,在現有的數據表上啟用或升級 Iceberg 讀取:

ALTER TABLE table_name SET TBLPROPERTIES(
  'delta.columnMapping.mode' = 'name',
  'delta.enableIcebergCompatV2' = 'true',
  'delta.universalFormat.enabledFormats' = 'iceberg');

使用 REORG 啟用或升級 Iceberg 讀取支援

您可以使用 REORG 來啟用 Iceberg 讀取和重寫基礎數據檔,如下列範例所示:

REORG TABLE table_name APPLY (UPGRADE UNIFORM(ICEBERG_COMPAT_VERSION=2));

如果下列任一項成立,請使用 REORG

  • 您的資料表已啟用刪除向量。
  • 您先前已啟用 UniForm Iceberg 的 IcebergCompatV1 版本。
  • 您需要從不支援 Hive 樣式的 Parquet 檔案的 Iceberg 引擎 (例如 Athena 或 Redshift) 中讀取。

Iceberg 元數據產生何時發生?

在 Delta Lake 寫入交易完成之後,Azure Databricks 會非同步觸發中繼資料產生。 此中繼資料產生程序使用完成 Delta 交易的相同計算。

注意

也可以手動觸發 Iceberg 中繼資料產生。 請參閱手動觸發 Iceberg 中繼資料轉換

為避免與元數據產生相關的寫入延遲,經常提交的 Delta 資料表可能會將多個 Delta 提交合併成對 Iceberg 元數據的單一提交。

Delta Lake 可確保指定的計算資源上只有一個元數據產生程式正在進行中。 會觸發第二個並行元數據生成過程的提交可以成功提交至 Delta,但不會觸發異步的 Iceberg 元數據生成。 這可防止具有頻繁提交的工作負載的中繼資料產生的串聯延遲 (提交之間的間隔為數秒到數分鐘)。

請參閱 Delta 和 Iceberg 表版本

Delta 和 Iceberg 數據表版本

Delta Lake 和 Iceberg 允許使用儲存在數據表元數據中的數據表版本或時間戳進行時程移動查詢。

一般而言,Delta 表的版本不會與 Iceberg 的版本按照提交的時間戳或版本 ID 對齊。 若要確認指定版本的 Iceberg 資料表對應到哪個 Delta 數據表版本,您可以使用對應的數據表屬性。 請參閱檢查 Iceberg 中繼資料產生狀態

檢查 Iceberg 中繼資料產生狀態

在數據表上啟用 Iceberg 讀取會將下列欄位新增至 Unity 目錄和 Iceberg 數據表元數據,以追蹤元數據產生狀態:

中繼資料欄位 描述
converted_delta_version 已成功生成 Iceberg 元數據的 Delta 表最新版本。
converted_delta_timestamp 已成功產生 Iceberg 中繼資料的最新 Delta 提交的時間戳記。

在 Azure Databricks 上,您可以執行下列其中一項來檢閱這些中繼資料欄位:

  • 檢閱 Delta Uniform Iceberg 傳回的 DESCRIBE EXTENDED table_name 部分。
  • 使用目錄總管檢閱數據表元數據。
  • 使用 REST API 來取得數據表

如需瞭解如何在 Azure Databricks 之外檢閱數據表屬性,請參閱您的 Iceberg 讀取客戶端的文件。 針對 OSS Apache Spark,您可以使用下列語法來查看這些屬性:

SHOW TBLPROPERTIES <table-name>;

手動觸發 Iceberg 中繼資料轉換

您可以針對最新版的 Delta 數據表手動觸發 Iceberg 元數據產生。 此作業會同步執行,這表示完成時,Iceberg 中可用的數據表內容會反映轉換程序啟動時可用的最新版 Delta 資料表。

在正常情況下,此操作不是必需的,但如果遇到下列情況,它會有所幫助:

  • 叢集會在自動中繼資料產生成功之前終止。
  • 錯誤或工作失敗會中斷中繼資料產生。
  • 不支援 UniForm Iceberg 元數據產生的用戶端會寫入 Delta 數據表。

使用下列語法手動觸發 Iceberg 元數據產生:

MSCK REPAIR TABLE <table-name> SYNC METADATA

請參閱 REPAIR TABLE

使用中繼資料 JSON 路徑來讀取 Iceberg

某些 Iceberg 用戶端會要求您提供版本化元數據檔案的路徑,以註冊外部 Iceberg 數據表。 每次 Azure Databricks 將新版本的 Delta 數據表轉換成 Iceberg 時,都會建立新的元數據 JSON 檔案。

使用中繼資料 JSON 路徑來設定 Iceberg 的用戶端包括 BigQuery。 如需組態詳細資料,請參閱 Iceberg 讀取器用戶端文件。

Delta Lake 會使用下列模式,將 Iceberg 元數據儲存在數據表目錄底下:

<table-path>/metadata/<version-number>-<uuid>.metadata.json

在 Azure Databricks 上,您可以執行下列其中一項來檢閱此中繼資料位置:

  • 檢閱 Delta Uniform Iceberg 傳回的 DESCRIBE EXTENDED table_name 部分。
  • 使用目錄總管檢閱數據表元數據。
  • 將下列命令與 REST API 搭配使用:
GET api/2.1/unity-catalog/tables/<catalog-name>.<schame-name>.<table-name>

回應包含下列資訊:

{
    ...
          "delta_uniform_iceberg": {
              "metadata_location":  "<cloud-storage-uri>/metadata/v<version-number>-<uuid>.metadata.json"
    }
}

重要

以路徑為基礎的 Iceberg 讀取器用戶端可能需要手動更新和重新整理元數據 JSON 路徑,才能讀取目前的數據表版本。 使用過時版本查詢 Iceberg 數據表時,使用者可能會遇到錯誤,因為已從 Delta 數據表中移除具有 VACUUM的 Parquet 數據檔。

限制

已啟用 Iceberg 讀取的所有資料表都有下列限制:

  • Iceberg 讀取不適用於已啟用刪除向量的數據表。 請參閱什麼是刪除向量?
  • 已啟用 Iceberg 讀取的 Delta 表不支援 VOID 類型。
  • Iceberg 用戶端支援是唯讀的。 不支援寫入。
  • 儘管 Azure Databricks 支援 Iceberg 讀取,Iceberg 閱讀器用戶端還是可能會有個別的限制。 請參閱您的所選客戶端的文件。
  • Delta Sharing 的接收者只能將資料表讀取為 Delta,即使啟用了 Iceberg 讀取功能。
  • 某些 Delta Sharing 讀取器用戶端不支援 Iceberg 讀取所使用的部分 Delta Lake 數據表功能。 請參閱什麼是 Delta Sharing?

當 Iceberg 讀取功能開啟時,變更數據摘要能在 Delta 用戶端中運作,但不支援 Iceberg。