在 Databricks Runtime 14.1 及以上版本中,列追蹤會為每列指派穩定的列 ID 與列提交版本,實現列層級的血緣追蹤。 部分實體化視圖的增量更新需要此功能。
所有 Apache Iceberg v3 表格都包含列追蹤功能。 請參閱 使用 Apache Iceberg v3 功能。 對於 Delta Lake 表格,你必須明確啟用列追蹤功能。
Note
啟用列追蹤會升級表格寫入協定,並可能影響與外部 Delta Lake 用戶端的相容性。 請參閱 Delta Lake 功能相容性和通訊協定。
啟用 Delta Lake 表格的列追蹤功能
要啟用 Delta Lake 資料表的列追蹤,請在建立資料表時設定該資料表屬性 delta.enableRowTracking = true :
CREATE TABLE table_name
TBLPROPERTIES (delta.enableRowTracking = true)
AS SELECT * FROM source_table;
要啟用現有 Delta Lake 表格的列追蹤,請使用以下範例:
ALTER TABLE table_name SET TBLPROPERTIES (delta.enableRowTracking = true);
重要
在現有的數據表上啟用數據列追蹤,會自動將數據列標識符和數據列認可版本指派給數據表中的所有現有數據列。 此過程可能導致多個新版本的表格建立,且完成時間相當長。
警告
如果你的表格是連續寫入的目標,例如結構化串流工作負載,請在啟用列追蹤前暫停寫入操作,操作完成後再繼續。 使用 ALTER TABLE 啟用資料列追蹤會更新資料表中繼資料,導致任何並行的寫入作業在此作業進行期間因 MetadataChangedException 而失敗。 參見 衝突例外。
複製資料表會建立獨立的歷史,因此複製資料表的列 ID 和列提交版本與原始資料表不符。
中繼資料欄位
數據列追蹤會將兩個隱藏的元數據欄位新增至數據表。 您可以明確地將這些欄位新增至查詢以傳回值。
| 欄位名稱 | 類型 | 價值 | Explanation |
|---|---|---|---|
_metadata.row_id |
Long | 列的唯一識別碼。 | 每當使用 MERGE 或 UPDATE 語句修改數據列時,數據列就會保留相同的標識碼。 |
_metadata.row_commit_version |
Long | 該列最後插入或更新時的 Delta 日誌或表格版本。 | 每當使用 MERGE 或 UPDATE 語句修改數據列時,就會指派新版本。 |
某些作業會使用事務歷史記錄儲存這些元數據欄位。 在已啟用數據列追蹤的數據表上執行 OPTIMIZE 或 REORG 作業會重寫數據檔來儲存這些欄位。
關閉 Delta Lake 表格上的行追蹤功能
要關閉 Delta Lake 表格的列追蹤,請將 table 屬性設為 false。
ALTER TABLE table_name SET TBLPROPERTIES (delta.enableRowTracking = false);
重要
關閉列追蹤不會移除對應的表格功能,也不會降低表格協議版本。 它也不會從目標資料表移除元資料欄位。 若要完全移除表格功能並降級協定,請使用 DROP FEATURE。 請參閱 刪除 Delta Lake 資料表功能和降級資料表協定。
關閉列追蹤後,產生的列 ID 不再可靠,無法追蹤唯一列。
局限性
在讀取變更資料饋送的過程中,無法存取行 ID 和行提交版本號的元資料欄位。 請參閱 在 Azure Databricks 上使用變更資料摘要。