把錶或分割槽劃分成bucket有兩個理由
1,更快,桶為表加上額外結構,鏈結相同列劃分了桶的表,可以使用map-side join更加高效。
2,取樣sampling更高效。沒有分割槽的話需要掃瞄整個資料集。
3. 與分割槽不同的是,分割槽依據的不是真實資料表檔案中的列,而是我們指定的偽列,但是分桶是依據資料表中真實的列而不是偽列。所以在指定分割槽依據的列的時候要指定列的型別,因為在資料表檔案中不存在這個列,相當於新建乙個列。而分桶依據的是表中已經存在的列,這個列的資料型別顯然是已知的,所以不需要指定列的型別。
hive> create table bucketed_user (id int,name string)總結:我們發現其實桶的概念就是mapreduce的分割槽的概念,兩者完全相同。物理上每個桶就是目錄裡的乙個檔案,乙個作業產生的桶(輸出檔案)數量和reduce任務個數相同。clustered by (id) sorted by (id asc) into 4 buckets;
重點1:clustered by來指定劃分桶所用列和劃分桶的個數。hive對key的hash值除bucket個數取餘數,保證資料均勻隨機分布在所有bucket裡。
重點2:sorted by對桶中的乙個或多個列另外排序
而分割槽表的概念,則是新的概念。分割槽代表了資料的倉庫,也就是資料夾目錄。每個資料夾下面可以放不同的資料檔案。通過資料夾可以查詢裡面存放的檔案。但資料夾本身和資料的內容毫無關係。
桶則是按照資料內容的某個值進行分桶,把乙個大檔案雜湊稱為乙個個小檔案。
這些小檔案可以單獨排序。如果另外乙個表也按照同樣的規則分成了乙個個小檔案。兩個表join的時候,就不必要掃瞄整個表,只需要匹配相同分桶的資料即可。效率當然大大提公升。
同樣,對資料抽樣的時候,也不需要掃瞄整個檔案。只需要對每個分割槽按照相同規則抽取一部分資料即可。
資料分桶的作用:
好處:1、方便抽樣
2、提高join查詢效率
(1)獲得更高的查詢處理效率。桶為表加上了額外的結構,hive 在處理有些查詢時能利用這個結構。具體而言,連線兩個在(包含連線列的)相同列上劃分了桶的表,可以使用 map 端連線 (map-side join)高效的實現。比如join操作。對於join操作兩個表有乙個相同的列,如果對這兩個表都進行了桶操作。那麼將儲存相同列值的桶進行join操作就可以,可以大大較少join的資料量。
(2)使取樣(sampling)更高效。在處理大規模資料集時,在開發和修改查詢的階段,如果能在資料集的一小部分資料上試執行查詢,會帶來很多方便。
Hive的分割槽表和分桶表的區別
是指按照資料表的某列或某些列分為多個區,區從形式上可以理解為資料夾,比如我們要收集某個大型 的日誌資料,乙個 每天的日誌資料存在同一張表上,由於每天會生成大量的日誌,導致資料表的內容巨大,在查詢時進行全表掃瞄耗費的資源非常多。那其實這個情況下,我們可以按照日期對資料表進行分割槽,不同日期的資料存放在...
Hive的分割槽表和分桶表的區別
1,hive分割槽。是指按照資料表的某列或某些列分為多個區,區從形式上可以理解為資料夾,比如我們要收集某個大型 的日誌資料,乙個 每天的日誌資料存在同一張表上,由於每天會生成大量的日誌,導致資料表的內容巨大,在查詢時進行全表掃瞄耗費的資源非常多。那其實這個情況下,我們可以按照日期對資料表進行分割槽,...
Hive的分割槽表和分桶表的區別
1.hive分割槽。是指按照資料表的某列或某些列分為多個區,區從形式上可以理解為資料夾,比如我們要收集某個大型 的日誌資料,乙個 每天的日誌資料存在同一張表上,由於每天會生成大量的日誌,導致資料表的內容巨大,在查詢時進行全表掃瞄耗費的資源非常多。那其實這個情況下,我們可以按照日期對資料表進行分割槽,...