兩種用於優化查詢性能的數據組織策略,數倉設計的關鍵概念,可提升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 發佈!