Apache Iceberg 是一種開源的分析工作負載表格格式,支援結構演化、時間旅行及隱藏分割等功能。 像 Delta Lake 一樣,Iceberg 建立了一個抽象層,允許對物件儲存中的資料進行 ACID 交易。
Azure Databricks 支援使用 Apache Parquet 檔案格式的 Iceberg 表格,以及 Iceberg 規範的第 1、2 和 3 版本。 Iceberg 會為每個資料表的變更撰寫新的元數據檔案,以維持原子性和一致性。 Azure Databricks 中的所有 Iceberg 表格都遵循開放式 Iceberg 表格格式規範。 詳見 冰山表規範。
Iceberg 目錄是 Iceberg 資料表架構的頂層,載入資料表時會回傳當前的元資料。 Iceberg 目錄可處理建立、刪除及重新命名資料表等作業。
Azure Databricks 支援由以下機構管理的 Iceberg 表格:
要求
要使用 Apache Iceberg 管理或外部資料表,您必須符合以下條件:
- 使用已啟用 Unity Catalog 的工作區。
- 使用 Databricks Runtime 16.4 LTS 或以上版本。
對於受管理資料表,你還必須符合以下條件:
- 一個支援無伺服器運算的工作空間
Azure Databricks 使用 serverless compute 來維護 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 目錄會管理這些數據表上的快照集到期和檔案壓縮等生命週期工作。
- 液態聚類 提升查詢效能。
- 預測優化 自動化作業,降低儲存成本並提升查詢速度。
- 具體化檢視表支援增量重新整理,以便在來源資料變更時讓結果保持最新狀態。
- 串流資料表 支援從 Kafka 及使用 Databricks SQL 的雲端物件儲存的增量資料載入。
Databricks 建議使用 Iceberg 客戶端版本 1.9.2 及以上來讀寫 Unity Catalog。
讀取由其他目錄管理的 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 目錄認證發放以供外部系統存取。
警告
使用預設儲存空間的工作區不支援憑證發放。 請參閱限制。
複製受管理的 Iceberg 資料表
你可以使用 DEEP CLONE 建立受管理的 Iceberg 資料表的完整且獨立的副本。 深度複製會將資料表的資料檔案和元資料複製到 Unity Catalog 中新管理的 Iceberg 資料表。 參見 複製受管理的 Iceberg 資料表。
建立一個與外部 Iceberg 閱讀器相容的具體視圖
Important
受管理的 Iceberg 實體化檢視目前處於 公開預覽 階段。 要啟用此功能,請聯繫你的 Databricks 帳戶團隊。
你可以建立一個與外部 Iceberg 閱讀器相容的 具體化視圖 。 若要建立一個,請在 USING ICEBERG 陳述式中使用 CREATE MATERIALIZED VIEW。 完整語法請參見CREATE MATERIALIZED VIEW(pipelines)。 完整需求請參見 啟用外部資料存取串流資料表與實體化檢視。
CREATE MATERIALIZED VIEW <mv_name>
USING ICEBERG
AS
SELECT * FROM samples.nyctaxi.trips;
建立實體化視圖後,執行 REPAIR TABLESYNC METADATA。 參見 REPAIR TABLE。
REPAIR TABLE <mv_name> SYNC METADATA;
外部 Iceberg 讀者可以讀取實體化檢視,但無法寫入其中。 若要從外部 Iceberg 閱讀器讀取實體化視圖,請參見 啟用外部資料存取串流表與具體化視圖。
分區演變
透過分割演化,你可以在不重寫資料的情況下,改變現有 Apache Iceberg 資料表的分割方案。 新資料會以更新的分割區配置寫入,現有資料則保留原始分割區配置。 Apache Iceberg 會追蹤分割區規格,並在查詢時套用正確的過濾器。 請參閱 Apache Iceberg 的分割演化。
備註
受管理的 Iceberg 資料表可以透過外部 Iceberg 引擎使用 Iceberg REST 目錄支援分割區演化,但 Databricks SQL 不提供此支援。 基於表達式的分割轉換,如 years() 和 bucket() ,不支援受管理的 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;
限制
以下限制適用於 Azure Databricks 中的 Iceberg 資料表,且可能會有所變更:
- Iceberg 數據表僅支援 Apache Parquet 檔格式。
- 對於 Iceberg v2,不支援位置刪除和等值刪除。 相反地,Azure Databricks 支援 Iceberg v3 的列級刪除向量。
- 不支援分支和標記。 讀取外國冰山數據表時,只能存取主要分支。
- 分區:
- 只有在從外部 Iceberg 引擎互動時,受控管理的 Iceberg 資料表才支援分區演進。
- 外部冰山數據表不支援分割演進。
- 不支援依
BINARY類型進行分區。
- 視圖 無法從外部 Iceberg 引擎存取。
- 不支援下列資料類型:
UUIDFixed(L)TIME- 使用
STRUCT的必填欄位的巢狀結構
- 關於 Iceberg v3 的具體限制,請參見 限制。
管理的 Iceberg 資料表限制
下列限制特別適用於 Managed Iceberg 數據表:
- AI 搜尋不被支援。 請參閱 Databricks AI 搜尋。
- 如果你用 Managed 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。