Important
Unity 目錄管理的 Iceberg 數據表可在 Databricks Runtime 16.4 LTS 和更新版本中以 公開預覽 版提供。 外部 Iceberg 數據表也處於 Databricks Runtime 16.4 LTS 和更新版本中的公開預覽狀態。
Iceberg v3 的功能可在 Databricks 執行環境 18.0 及以上版本的 公開預覽 版中取得。 請參閱 使用 Apache Iceberg v3 功能。
Apache Iceberg 是一種開源的分析工作負載表格格式。 它支援架構演進、時間移動和隱藏資料分割等功能。 就像 Delta Lake 一樣,Iceberg 提供抽象層,可在儲存在物件記憶體中的數據上啟用 ACID 交易。 Azure Databricks 支援使用 Apache Parquet 檔案格式的 Iceberg 表格。 Iceberg 會為每個資料表的變更撰寫新的元數據檔案,以維持原子性和一致性。
Iceberg 目錄是 Iceberg 資料表架構的最上層。 它會處理建立、卸除和重新命名數據表等作業。 其主要責任是在載入數據表時提供目前的元數據。 Azure Databricks 支援由以下機構管理的 Iceberg 表格:
Azure Databricks 中的所有 Iceberg 表格都遵循開放式 Iceberg 表格格式規範。 詳見 冰山表規範。
在 Unity 目錄中建立 Iceberg 資料表
Unity 目錄中建立的 Iceberg 數據表是受控的 Iceberg 數據表。 您可以使用下列方式建立這些資料表:
- Databricks Runtime 或 Databricks SQL
- 支援 Iceberg REST 類別目錄 API 的外部 Iceberg 相容引擎,例如 Apache Spark、Flink、Trino 或 Kafka。 請參閱 Apache Iceberg 用戶端的 Access Azure Databricks 表格。
Managed Iceberg 表格與 Azure Databricks 平台功能完全整合。 Unity 目錄會管理這些數據表上的快照集到期和檔案壓縮等生命週期工作。 Managed Iceberg 數據表也支援 液體叢集,這可改善查詢效能。 預測性優化 會將這些工作自動化,以降低儲存成本並改善查詢速度。 Databricks 建議使用 Iceberg 用戶端 1.9.2 和更新版本來讀取和寫入 Unity 目錄。
讀取由其他目錄管理的 Iceberg 資料表
外部 Iceberg 資料表是由 Unity 目錄以外的目錄管理的 Iceberg 資料表。 外部目錄會儲存數據表目前的元數據。 Azure Databricks 使用 Lakehouse Federation 來擷取元資料並從物件儲存讀取資料表。
外部 Iceberg 資料表在 Azure Databricks 中為唯讀,且平台支援有限。
利用外部系統存取 Iceberg 表格
您可以使用 Iceberg REST 目錄 API 來存取 Unity 目錄中的所有 Iceberg 資料表。 此開放式 API 支援跨不同語言和平臺從外部 Iceberg 引擎讀取和寫入作業。 請參閱 Apache Iceberg 用戶端的 Access Azure Databricks 表格。
REST 目錄支援認證販賣,其會將暫存認證傳遞給外部引擎,以存取基礎記憶體。 如需詳細資訊,請參閱 Unity 目錄認證發放以供外部系統存取。
警告
使用預設儲存空間的工作區不支援憑證發放。 請參閱限制。
分區演變
透過分割演化,你可以在不重寫資料的情況下,改變現有 Apache Iceberg 資料表的分割方案。 新資料會以更新的分割區配置寫入,現有資料則保留原始分割區配置。 Apache Iceberg 會追蹤分割區規格,並在查詢時套用正確的過濾器。 請參閱 Apache Iceberg 的分割演化。
備註
受管理的 Iceberg 資料表可以透過外部 Iceberg 引擎使用 Iceberg REST 目錄支援分割區演化,但 Databricks SQL 不提供此支援。 基於表達式的分割轉換,如 years() 和 bucket() ,不支援受管理的 Iceberg 資料表。 請參閱 Iceberg 數據表限制。
若要設定外部存取,請參考 Apache Iceberg 用戶端的 Access Azure Databricks表。
以下範例展示了如何在 Spark SQL 及 Iceberg 擴充套件中使用分割演化。 關於 Apache Iceberg 分割演化語法及支援的轉換,請參見 Apache Iceberg Spark DDL。
新增一個分割欄位
要在現有資料表中新增新的分割欄位:
ALTER TABLE catalog.schema.table ADD PARTITION FIELD column_name;
刪除一個分割欄位
要從表格中移除現有的分割欄位:
ALTER TABLE catalog.schema.table DROP PARTITION FIELD column_name;
替換分割欄位
若要在不進行中間重劃分的情況下,將一個分割欄位替換為另一個分割欄位:
ALTER TABLE catalog.schema.table REPLACE PARTITION FIELD old_column WITH new_column;
Iceberg 數據表限制
以下限制適用於 Azure Databricks 中的 Iceberg 資料表,且可能會有所變更:
- Iceberg 數據表僅支援 Apache Parquet 檔格式。
- Azure Databricks 支援 Iceberg 規範的第 1、2 及 3 版本。
- 如需 v3 特定的限制,請參閱 限制。
- 不支援 Iceberg v2 位置刪除和相等型刪除。 相反地,Azure Databricks 支援 Iceberg v3 的列級刪除向量。
- 不支援分支和標記。 讀取外國冰山數據表時,只能存取主要分支。
- 分區:
- 只有在從外部 Iceberg 引擎互動時,受控管理的 Iceberg 資料表才支援分區演進。
- 外部冰山數據表不支援分割演進。
- 不支援依
BINARY類型進行分區。
- 觀點不被支持。
- 不支援下列資料類型:
UUIDFixed(L)TIME- 使用
STRUCT的必填欄位的巢狀結構
管理的 Iceberg 資料表限制
下列限制特別適用於 Managed Iceberg 數據表:
- 不支援向量搜尋。
- Iceberg 不支援 變更資料摘要。 因此,在讀取受控 Iceberg 表格作為來源時,不支援增量處理:
- 實體化視圖和串流資料表
- 資料分析
- 線上表格
- Lakebase
- 資料分級
- 只有在為資料表維護啟用預測 最佳化 時,才能建立受管 Iceberg 資料表。
- 下列資料表屬性是由 Unity 目錄所管理,而且無法手動設定:
write.location-provider.implwrite.data.pathwrite.metadata.pathwrite.format.defaultwrite.delete.format.default
- 不支援變更資料表壓縮的壓縮編解碼器。 所有資料表預設都會使用 Zstd。
- 不支援以表達式劃分(例如
years(), ,months()days()hours()bucket(), , ) - Apache Iceberg 不支援的功能也無法用於受管理的 Iceberg 資料表。 這包括 Delta Lake 產生的計算欄位、在 Azure Databricks 中的限制,以及 Delta Lake 的排序規則支援。
Foreign Iceberg 數據表限制
下列限制特別適用於外部 Iceberg 資料表:
- 時間旅行僅支援先前在 Azure Databricks 中讀取過的 Iceberg 快照(即執行
SELECT陳述式的快照)。 - 在使用條件式篩選時,使用 Iceberg 分區的 bucket 轉換函數可能會降低查詢效能。
- 像 Amazon S3 這樣的雲端存儲分層產品未與外部 Iceberg 表格整合。 在 Azure Databricks 存取外部 Iceberg 資料表,可以還原以較低成本儲存層級歸檔的資料。
- 在專用存取模式叢集上,Iceberg 資料表上的讀取和
REFRESH FOREIGN TABLE作業需要ALL PRIVILEGES。