3 回答

TA貢獻1805條經驗 獲得超9個贊
分區數據通常用于水平分布負載,這具有性能優勢,并有助于以邏輯方式組織數據。示例:如果我們處理的是一個大employee
表,并且經常使用帶有WHERE
將結果限制到特定國家或地區的子句運行查詢。為了獲得更快的查詢響應,Hive表可以是PARTITIONED BY (country STRING, DEPT STRING)
。分區表更改了Hive構造數據存儲的方式,Hive現在將創建反映分區結構的子目錄,例如
... /員工/ 國家 / 地區= ABC / DEPT = XYZ。
如果查詢來自雇員的限制country=ABC
,它將僅掃描一個目錄的內容country=ABC
。僅當分區方案反映通用篩選時,這才能大大提高查詢性能。分區功能在Hive中非常有用,但是,創建過多分區的設計可能會優化某些查詢,但會對其他重要查詢不利。另一個缺點是,分區過多是不必要地創建了大量的Hadoop文件和目錄,并給NameNode帶來了開銷,因為它必須將文件系統的所有元數據都保留在內存中。
存儲桶是用于將數據集分解為更易于管理的部分的另一種技術。例如,假設一個表date
用作頂級分區和employee_id
第二級分區會導致太多的小分區。相反,如果我們對employee表進行存儲并employee_id
用作存儲列,則該列的值將由用戶定義的數字散列到存儲桶中。具有相同記錄的記錄employee_id
將始終存儲在同一存儲桶中。假設的數量employee_id
遠大于存儲桶的數量,則每個存儲桶將具有許多employee_id
。創建表時,您可以指定如下CLUSTERED BY (employee_id) INTO XX BUCKETS;
其中XX是存儲桶數。桶裝有幾個優點。桶的數量是固定的,因此它不會隨數據波動。如果兩個表由進行存儲employee_id
,則Hive可以創建邏輯上正確的采樣。桶也有助于進行有效的地圖側聯接等。
- 3 回答
- 0 關注
- 1265 瀏覽
添加回答
舉報