hive分割槽和分桶你熟悉嗎?

公众号-JavaEdge發表於2024-03-10

兩種用於最佳化查詢效能的資料組織策略,數倉設計的關鍵概念,可提升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 釋出!

相關文章