2015-11-04 92 views
2

繼續問題:What is the difference between partitioning and bucketing a table in Hive ?蜂巢桶vs分區

假設我們已通過Salary列對員工表進行分區。如果我們使用基於salary列的where子句中的條件從此表編寫select查詢,那麼查詢將運行得很快......因爲它只會從特定分區獲取細節。

但是,如果我們根據薪水欄和固定桶數設置相同的表格,而不是分區。那麼在這種情況下,如果我們編寫相同的查詢,我想知道該查詢如何從桶中受益?任何人都可以解釋嗎?

回答

0

bucketing的一個用例是快速採樣數據。

試想一個表

CREATE TABLE employee(employeeId String, salary Double) 
CLUSTERED BY(user_id) INTO 10 BUCKETS; 

我們不是工資,而是由僱員分時段的,使得每個員工放在有點隨機分爲桶。我們可以說,統計上可能的是,薪資在各個桶中均勻分配。

如果我們想要找出平均工資,我們可以在桶的一個子集上運行這個查詢,這比在整個數據集上運行查詢要快,但給出了一個很好的近似值。

Select Average(salary) FROM employee TABLESAMPLE(BUCKET 1 OUT OF 10 ON employeeId); 
0

正如mattinbits所說,如果您在員工ID而不是薪水上分流,分段將會更有用。

和水桶的數量可以保持在2像2,4,8,16,32電源...

要決定多少桶,你應該考慮在 數據量一個桶=(數據的總大小/桶的數量)<(應小於)內存大小。

並且當您在同一列上使用具有存儲桶的其他表的聯接時,使用與此表的存儲桶數相同或多個存儲桶的數量的存儲桶,則聯接會發生在存儲器中,或者可以說地圖邊加入,這是更快..

你應該選擇分區時,你會使用很多where子句,在同一列(分區列),一個很好的候選分區列可以是:狀態,城市,國家,年份,月份,部門,