為了支援增全量儲存和處理一體化架構,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用來配置歷史資料的有效查詢時間範圍等。更多屬性可參見Delta Table表參數。
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。