為了支持增全量存儲和處理一體化架構,Delta Table(簡稱DT)設計了統一的表數據組織格式,既可支持MaxCompute普通表的所有功能,同時也能很好的支持增量處理鏈路的新場景,包括time travel查詢、upsert操作等。本文為您介紹DT的表數據格式詳情。
Delta Table的表關鍵屬性
Delta Table目前只支持主鍵表,您可以在執行建表命令Create Table時設置關鍵屬性:primary key (PK)及tblproperties ("transactional"="true" )。
primary key (PK):設置本屬性后,可高效支持Upsert數據導入功能,PK值相同的多行記錄在快照查詢或者COMPACTION操作后會merge成一行數據,只保留最新狀態。
tblproperties ("transactional"="true" ):transactional屬性代表滿足ACID事務特性,保障快照隔離和讀寫并發控制,寫入的每行數據會附加事務屬性字段,比如事務timestamp,用來支持Time travel查詢,過濾出正確數據版本的記錄。
此外還可設定其他一些重要的表屬性,比如write.bucket.num用來配置數據寫入的并發度,acid.data.retain.hours用來配置歷史數據的有效查詢時間范圍等。更多屬性可參見Transaction Table2.0表參數。
Delta Table數據文件類型
Delta Table支持多種數據文件組織格式,來高效支持全量讀寫和近實時增量讀寫等多種場景,主要包含BaseFile和DeltaFile兩種形態。
其中:
DeltaFile:每次事務Commit寫入(Update/Delete)的數據文件類型,會保存每行數據的中間歷史狀態,用于滿足近實時增量讀寫需求。Clustering合并操作也會生成DeltaFile,按照列式壓縮存儲。
BaseFile:DeltaFile經過COMPACTION合并操作后生成的數據文件類型,會消除中間歷史狀態,PK值相同的記錄只會保留一行,按照列式壓縮存儲,用來支撐高效的全量數據查詢需求。
進行數據查詢時:
每次快照查詢會先找到最新生成的BaseFile,然后查找在BaseFile之后寫入所有符合要求的DeltaFile一起Merge之后輸出,因此查詢模式屬于Merge On Read。更多查詢細節請參見Time travel查詢。
所有數據文件會按照PK列進行排序,可有效提升Merge的效率,并有助于DataSkipping查詢優化。數據文件會按照列式壓縮存儲,可有效減少存儲的數據量,節省成本,也可有效地提升IO讀寫效率。
數據存儲分桶
為了進一步優化讀寫效率,Delta Table支持按照BucketIndex對數據進行切分存儲,BucketIndex數據列默認復用PK列,bucket數量可通過配置表屬性write.bucket.num指定,因此對同一張表或分區的數據,寫入數據會按PK列值對數據進行切分,相同PK值的記錄會落在同一個bucket中。
數據的近實時增量導入可通過bucket數量水平擴展來支持高并發,因此需根據數據寫入的流量以及表數據總存儲大小來評估設置合理的bucket數量。Bucket數量過多,容易產生過多的小文件,影響數據讀寫效率和存儲的穩定性,Bucket數量過少,則不容易滿足高流量高速度的近實時導入需求。
此特性也有助于提升數據查詢效率,如果過濾條件為Bucket數據列,也可有效地進行Bucket裁剪,減少查詢的數據量。并且如果GroupBY或者Join的Key列和Bucket數據列相同,則可直接進行Local Join或者GroupBy操作,減少Shuffle,節省計算資源和提升查詢性能。
數據優化管理操作例如小文件clustering、compaction等都可按照Bucket粒度來并發執行計算,提高執行效率,縮短運行時間。
記錄類型
目前記錄只支持upsert、delete兩種數據類型進行寫入和存儲,upsert包含insert / update兩種隱含語義,如記錄不存在就代表insert,如已存在就代表update。