[英]Hive's Bucket Map Join
我有一個Hadoop集群,我使用Hive進行查詢,我想連接兩個大表,其中一個有小存儲桶,從我的閱讀中看來,如果我將兩個表都存儲在join-key上,那將有助於提高性能。 。
所以我的設置是:
SELECT /*+ MAPJOIN(a) */
count(*)
FROM a JOIN B ON a.join_key = b.join_key;
問題1:以上設置足以觸發存儲桶映射連接嗎?
問題2:我對存儲桶映射連接的理解是,它啟動了一個本地任務,該任務創建每個存儲桶的哈希表,然后將散列的存儲桶上載到每個映射器。 這種理解正確嗎?
問題3:如果以上理解正確,那么為什么Hive會在本地進行哈希處理? 為什么它不上傳原始存儲桶,然后在地圖任務中執行哈希運算,從而實現並行處理和更高的速度?
以上設置足以觸發存儲桶映射連接嗎?
答案:1)如果“表/分區的總大小很大,不利於地圖聯接”,則進行存儲桶地圖聯接。 所需的設置是:set hive.optimize.bucketmapjoin = true;
2)如果“表/分區大小沒有非常大的限制,即表大小”,則進行SortMerge存儲桶聯接。 所需的設置是:set hive.optimize.bucketmapjoin = true; 設置hive.optimize.bucketmapjoin.sortedmerge = true; 設置hive.input.format = org.apache.hadoop.hive.ql.io.BucketizedHiveInputFormat;
我對存儲桶映射連接的理解是,它啟動了一個本地任務,該任務創建每個存儲桶的哈希表,然后將哈希存儲桶上載到每個映射器。 這種理解正確嗎?
答案:如果是Bucket映射聯接,則1)配置單元運行本地映射減少聯接以創建HashTable文件,2)壓縮並存檔文件並將其加載到分布式緩存(i-大哈希表文件將減慢Distributed的傳播ii。映射器正在等待來自分布式緩存的哈希表文件。)3)加載到映射Join任務的映射器中。
如果以上理解正確,那么為什么Hive會在本地進行哈希處理? 為什么它不上傳原始存儲桶,然后在地圖任務中執行哈希運算,從而實現並行處理和更高的速度?
答案:如果文件很大,那么我們將遇到以下問題-大哈希表文件將減慢分布式緩存的傳播。 ii-映射器正在等待來自分布式緩存的哈希表文件。
因此,執行以下步驟將提高性能:
1)配置單元運行本地映射減少聯接以創建HashTable文件,2)壓縮並存檔文件並加載到分布式緩存
3)加載到地圖Join任務的映射器。
這比映射聯接或普通聯接具有更好的性能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.