2014-03-04 79 views
0

我是新來的蜂巢,並閱讀了瓢潑大雨和MapSide加入蜂巢桶裝尺寸基於

「地圖加入可以利用分時段表(桶),因爲一個映射器在左表一桶只需要工作加載右表的相應的水桶執行連接。用於連接的語法是相同的用於同MEMOR ....」

假設我創建一個表作爲

CREATE TABLE bucketed_users (id INT,名稱STRING) CLUSTERED BY(id)INTO 4 BUCKETS;

我的問題是

1>所有4桶是否具有相同的大小?還是會依賴於數據中id的頻率?即如果一個id重複很多,相關桶將比其他桶更大。

2>會不會有與id相關的數據存在於兩個不同桶中的場景?即一個ID的記錄存在於存儲桶1中,另一個記錄存儲在存儲桶4中。

如果是,那麼優化程序如何處理分段數據?

如果有人試過這個,如果他們能分享他們的經驗,那將是非常好的。

回答

1

前一段時間被問到過這個問題,但由於它仍然是第一次點擊,也許這會幫助其他人。

在大多數情況下,只需創建一個表就可以在集羣上創建一個平面文件。您在Hive中運行的任何查詢都將轉換爲Map和Reduce作業。根據定義,您需要鍵和值才能進入縮減階段,並且每個映射器都必須搜索單個平面文件的塊才能發現給定的鍵和值。

當使用bucketed表時,Hive提供了一個按值聚簇的散列(在這裏使用id),並將單個表拆分爲許多平面文件。 由於該表是由ID的散列分割的,因此每個拆分的大小都基於表中的值。如果您沒有將映射到第三個存儲桶的值,則該平面文件將爲空。 您也不會在任何一個存儲桶中顯示任何給定的ID,除非您在插入語句之前忘記設置hive.enforce.bucketing = true。

Bucketing可以很好地提取數據並加快選擇使用按列搜索的列的語句。當您在羣集列上的兩個表上加入時,如果具有相同(或多個)存儲桶,也會發現有一些改進。

希望這會消除一些混淆。