兩種用於最佳化查詢效能的資料組織策略,數倉設計的關鍵概念,可提升Hive在讀取大量資料時的效能。
1 分割槽(Partitioning)
根據表的某列的值來組織資料。每個分割槽對應一個特定值,並對映到HDFS的不同目錄。
常用於經常查詢的列,如日期、區域等。這樣可以在查詢時僅掃描相關的分割槽,而不是整個資料集,從而減少查詢所需要處理的資料量,提高查詢效率。
物理上將資料按照指定的列(分割槽鍵)值分散存放於不同的目錄中,每個分割槽都作為表的一個子目錄。
建立分割槽表
CREATE TABLE orders (
order_id INT,
order_date DATE,
order_customer INT,
order_total FLOAT
)
PARTITIONED BY (country STRING);
基於country
列建立分割槽將使得每個國家的訂單資料儲存在不同的目錄中。
2 分桶(Bucketing)
使用雜湊函式將資料行分配到固定數量的儲存桶(即檔案)中。這在表內部進一步組織資料。
- 對提高具有大量重複值的列(如使用者ID)上JOIN操作的效率特別有用,因為它可以更有效地處理資料傾斜
- 要求在建立表時指定分桶的列和分桶的數目
建立分桶表
CREATE TABLE user_activities (
user_id INT,
activity_date DATE,
page_views INT
)
CLUSTERED BY (user_id) INTO 256 BUCKETS;
user_id
是用於分桶的列,資料會根據使用者ID的雜湊值分配到256個儲存桶中。
3 對比
- 分割槽是基於列的值,將資料分散到不同的HDFS目錄;分桶則基於雜湊值,將資料均勻地分散到固定數量的檔案中。
- 分割槽通常用於減少掃描資料的量,特別適用於有高度選擇性查詢的場景;而分桶有助於最佳化資料的讀寫效能,特別是JOIN操作。
- 分割槽可以動態新增新的分割槽,只需要匯入具有新分割槽鍵值的資料;分桶的數量則在建立表時定義且不能更改。
使用分割槽時要注意避免過多分割槽會導致後設資料膨脹,合理選擇分割槽鍵,確保分佈均勻;而分桶則通常針對具有高度重複值的列。兩者結合使用時,可以進一步最佳化表的讀寫效能和查詢效率。
關注我,緊跟本系列專欄文章,咱們下篇再續!
作者簡介:魔都技術專家兼架構,多家大廠後端一線研發經驗,各大技術社群頭部專家博主。具有豐富的引領團隊經驗,深厚業務架構和解決方案的積累。
負責:
- 中央/分銷預訂系統效能最佳化
- 活動&優惠券等營銷中臺建設
- 交易平臺及資料中臺等架構和開發設計
目前主攻降低軟體複雜性設計、構建高可用系統方向。
參考:
- 程式設計嚴選網
本文由部落格一文多發平臺 OpenWrite 釋出!