Delta Table是由MaxCompute自主研發的,為大規模分析型資料集打造的高效能表格式(Table Format),包含無主鍵表Append Delta Table和主鍵表PK Delta Table。本文概述Delta Table的準系統及操作。
功能概要
Delta Table是阿里雲MaxCompute自主研發的一種高效能表格式,支援ACID事務、增量查詢、回溯查詢(Time Travel)、動態Cluster分桶、資料即時更新、模式演化(Schema Evolution)等功能。利用MaxCompute平台內原生提供的湖倉一體和近Realtime Compute能力,使用者通過標準SQL即可建立、更新和查詢Delta Table,而無需關心複雜的底層儲存與中繼資料管理,後者均由 MaxCompute自動維護和最佳化,兼顧易用性與高性價比。
功能規格
類別 | 功能項 | Append Delta Table | PK Delta Table |
基礎DML | Insert / Update / Delete / Merge Into。 | 支援 | 支援 |
ACID 事務 | Read Committed/Snapshot Isolation。 詳情請參見ACID交易管理。 | 支援 | 支援 |
主鍵 | 定義主鍵(Primary Key)。 | 不支援 | 支援部分列更新 |
模式演化(Schema Evolution) | 列增加、刪除、重新命名、順序修改、列類型修改。 詳情請參見ALTER TABLE。 | 支援 | 支援 |
資料匯入 |
| Stream/Batch Upload Stream Upload方式寫入即可見 | Upsert |
回溯查詢(Time Travel) | 支援按時間點或版本號碼直接查詢歷史快照,用於結果複現或審計分析。 詳情請參見Time Travel。 | 支援 | 支援 |
增量計算 | 增量物化視圖(Delta Live MV),增量讀取(Incremental Read)。 | 支援 (增量物化視圖適配中) | 支援 |
資料群組織最佳化 | 自動維護增量資料檔案,包括小檔案合并、多級COMPACTION、資料排序等最佳化,保持穩定高效的資料存放區和計算狀態。 | 支援 免配置bucket數,通過動態 Bucket 最佳化(Dynamic Bucketing)自適應資料分布。 | 支援 |
查詢效能最佳化 | 分區和檔案級統計資訊(Min/Max等)、分區裁剪、列裁剪、謂詞下推。 | 支援 | 支援 |
安全合規 | 支援 | 支援 | |
容災與備份 | 支援 | 支援 | |
成本 | AliORC列存壓縮/階層式存放區。 | 支援 | 支援 |
使用者體驗
面向即時化業務,即時資料更新
支援通過Stream Upload方式實現資料的即時寫入與更新(Upsert),寫入後立即可見。為了最大限度地平衡資料寫入的即時性與查詢效能,MaxCompute採用階層式存放區與最佳化策略:
保障寫入即時性:新寫入的資料首先以未排序的方式快速落盤至增量未聚簇桶(Nonclustered Bucket),確保資料寫入的低延遲和高吞吐。
提高SQL查詢效能:背景增量重聚簇(Incremental Reclustering)服務會非同步地將增量資料重排最佳化為有序的聚簇桶(Clustered Bucket)。查詢時,查詢引擎能高效裁剪已排序的主體資料,僅對少量增量資料進行掃描,從而兼顧了資料新鮮度與查詢效率。
高效增量資料處理與分析
基於底層的增量資料讀寫能力,MaxCompute進一步提供了豐富的上層功能,以提升端到端資料分析的實效性。可以結合增量計算、動態物化視圖(Delta Live MV)(邀測)等進階特性,構建高效的即時資料處理鏈路,加速從資料產生到業務洞察的轉化過程。
適應業務發展,突破原有表格式使用限制
動態分配Bucket:Append Delta Table表格式支援動態分配Bucket。使用者無需在DDL時指定Bucket數,無需預估每個Partion未來的資料量再去換算出合適Bucket數。隨著使用者資料的持續寫入,系統通過Bucket動態分配(Dynamic Bucketing)服務自動劃分Bucket或建立新Bucket,動態適應業務資料量變化,解決單Bucket內資料量過大或者過小導致的資料扭曲和資料片段等問題。
模式演化(Schema Evolution):滿足業務發展對資料欄位調整和資料精度提升的需求,支援添加、刪除、修改、重新命名列,且具備完全向後相容性,不會誤刪或遺失資料。
突破原有表限制:NSERT INTO、UPDATE、DELETE、MERGE INTO、Clustering排序儲存可以在Delta Table一張表內實現,突破原有普通分區表、聚簇表的、Transaction Table上述能力不可兼得的使用限制。
適配多引擎計算:包括MaxCompute SQL、MaxFrame、Spark on MaxCompute等;開源引擎如Flink、Spark、StarRocks等也可通過Connector和開放儲存API訪問Delta Table。
兼顧效能與可靠性
Delta Table適合TB到PB層級的海量資料管理,即使在極巨量資料規模下,中繼資料操作依然快速響應,查詢支援分區裁剪、列裁剪、謂詞下推,可避免不必要的資料掃描。
ACID交易管理:採用開放式並行存取控制,支援多寫入方並行作業,衝突寫會被檢測並重試,確保資料一致性。
安全合規:滿足資料安全與合規要求,支援儲存加密、ACL表級列級存取控制、行級許可權、動態脫敏等。
備份復原:資源回收筒模式的版本備份復原機制,保障在出現資料汙染和誤刪除時可快速將表回退到之前的健康狀態,降低營運和管理風險。
SQL相關操作
DDL
建立Append Delta Table
-- 建立Append Delta Table
CREATE TABLE <table_name> (
<col_name <data_type> [NOT NULL] [DEFAULT <default_value>] [comment <col_comment>], ...
)
[comment <table_comment>]
[RANGE CLUSTERED BY (<col_name> [, <col_name>, ...]) ]
TBLPROPERTIES (
"table.format.version"="2"
["acid.data.retain.hours"="hours"...]
)
[LIFECYCLE <days>];TBLPROPERTIES參數說明如下:
參數 | 是否必填 | 說明 | 備忘 |
"table.format.version"="2" | 是 | 聲明Delta Table表格式 | |
acid.data.retain.hours | 否 | 預設取值為24,取值範圍為 | 表示TimeTravel可查詢資料歷史狀態的時間範圍(單位為小時)。
|
acid.incremental.query.out.of.time.range.enabled | 否 | 預設 | True表示增量查詢指定的endTimestamp,可以大於表最大的資料Commit Time。在endTimestamp大於目前時間的情境下,使用者多次查詢可能得到不同的結果,因為可能存在新的資料插入。 支援修改表的此參數取值。 |
建立PK Delta Table
-- 建立PK Delta Table
CREATE TABLE <table_name> (
<col_name <data_type> [NOT NULL] [DEFAULT <default_value>] [comment <col_comment>], ...
PRIMARY KEY (<pk_col_name>[, <pk_col_name2>, ...] )
)
[comment <table_comment>]
TBLPROPERTIES (
"table.format.version"="2"
[, "write.bucket.num" = "N", "acid.data.retain.hours"="hours"...]
)
[LIFECYCLE <days>];參數說明如下:
PRIMARY KEY(PK):必填。建立Delta Table主鍵表時必填,可包含多列。可以定義一個或多個列作為主鍵,表示這些列的組合在表中必須唯一,文法遵循標準SQL primary key文法,pk列必須設定NOT NULL,不允許修改。
設定後,表資料會根據PK列去重,Unique約束在單個partition範圍內有效,或非分區表內有效。
TBLPROPERTIES參數說明如下:
參數 | 是否必填 | 說明 | 備忘 |
"table.format.version"="2" | 是 | 聲明Delta Table表格式 |
|
write.bucket.num | 否 | 預設取值為16,取值範圍為 | 表示每個partition或者非分區表的分桶數量,也表示資料寫入的並發節點數量。分區表支援修改,新分區預設生效;非分區表不支援修改。該參數用法可參考如下建議:
|
acid.data.retain.hours | 否 | 預設取值為24,取值範圍為 | 表示TimeTravel可查詢資料歷史狀態的時間範圍(單位為小時)。
|
acid.incremental.query.out.of.time.range.enabled | 否 | 預設 | True表示增量查詢指定的endTimestamp,可以大於表最大的資料Commit Time。在endTimestamp大於目前時間的情境下,使用者多次查詢可能得到不同的結果,因為可能存在新的資料插入。 支援修改表的此參數取值。 |
acid.write.precombine.field | 否 | 可以指定一個列的名稱,且只能指定一個。 | 如果指定了列名,在同一提交的檔案處理中,系統會結合主鍵(PK)列對資料去重,確保資料的唯一性和一致性。 說明 當一次性提交的資料量超過128MB時,會導致產生多個檔案,該參數對多個檔案不適用。 |
acid.partial.fields.update.enable | 否 | 設定為 | 該參數在建立表時進行設定。表建立成功後不支援修改。 |
注意事項
對比項 | Append Delta Table | PK Delta Table | 聚簇表 |
Bucket數量 | 無需指定write.bucket.num,Bucket數量根據實際資料量動態變化。 | 需在DDL時指定Bucket數,預設取值為16。 | / |
資料群組織策略 | RANGE CLUSTERED BY,不支援CLUSTERED BY,無需指定SORT BY 欄位,Bucket內資料排序預設使用RANGE CLUSTERD BY指定的欄位。 | 不支援設定CLUSTER BY,預設使用Primary Key做Hash Cluster。 | CLUSTERED BY |
生命週期LIFECYCLE | 必須大於等於Time Travel可查詢的生命週期,即 | / | / |
存量普通表不支援直接修改為Delta Table。
PK Delta Table不支援對主鍵列(PK)做表結構變更。
PK Delta Table暫不支援JSON類型。
不支援CREATE TABLE AS。
DML
支援插入或覆寫資料(INSERT INTO | INSERT OVERWRITE)、更新或刪除資料(UPDATE | DELETE)、MERGE INTO等文法。
DQL
支援通用的查詢分析方案。詳情可參考DQL操作(SELECT)。
資料匯入
Append Delta Table支援通過批量資料轉送(Upload)與 流式資料轉送(Stream Upload)兩種方式匯入資料,由於沒有PK,資料轉送鏈路不支援Upsert/Delete介面。
PK Delta Table支援通過Tunnel Upsert/Delete介面寫入資料,對於不存在的PK,Upsert操作插入新的資料;對於已經存在的PK,Upsert操作將對應非PK欄位更新。
資料群組織最佳化
Append Delta Table資料群組織結構,請參考Append Delta Table資料群組織最佳化,底層採用Range Clustering結構,預設使用Row_ID作為clustering key,bucket數量隨著使用者資料增長動態分配,使用者指定Cluster Key之後,通過後台clustering作業對資料執行增量reclustering,保證資料的整體有序性。
PK Delta Table資料群組織結構,請參考PK Delta Table資料群組織最佳化,底層採用Hash Clustering結構,通過將PK欄位Hash分桶的方式,實現資料的高效寫入與更新。