hive分區和分桶你熟悉嗎?

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章