鎖屏面試題百日百刷-Hive篇(十一)
? 鎖屏面試題百日百刷,每個工作日堅持更新面試題。鎖屏面試題app、小程序現(xiàn)已上線,官網(wǎng)地址:https://www.demosoftware.cn。已收錄了每日更新的面試題的所有內(nèi)容,還包含特色的解鎖屏幕復習面試題、每日編程題目郵件推送等功能。讓你在面試中先人一步!接下來的是今日的面試題:
1.如何理解SMB Join
全稱Sort Merge Bucket Join。
作用
大表對小表應(yīng)該使用MapJoin來進行優(yōu)化,但是如果是大表對大表,如果進行shuffle,那就非??膳?,第一個慢不用說,第二個容易出異常,此時就可以使用SMB Join來提高性能。SMB Join
基于bucket-mapjoin的有序bucket,可實現(xiàn)在map端完成join操作,可以有效地減少或避免shuffle的數(shù)據(jù)量。SMB join的條件和Map join類似但又不同。
條件

注意事項
hive并不檢查兩個join的表是否已經(jīng)做好bucket且sorted,需要用戶自己去保證join的表數(shù)據(jù)sorted,否則可能數(shù)據(jù)不正確。
有兩個辦法:
1)hive.enforce.sorting 設(shè)置為 true。開啟強制排序時,插數(shù)據(jù)到表中會進行強制排序,默認false。
2)插入數(shù)據(jù)時通過在sql中用distributed c1 sort by c1 或者 cluster by c1
另外,表創(chuàng)建時必須是CLUSTERED且SORTED,如下:
create table test_smb_2(mid string,age_id string)
CLUSTERED BY(mid) SORTED BY(mid) INTO 500 BUCKETS;
綜上,涉及到分桶表操作的齊全配置為:
--寫入數(shù)據(jù)強制分桶
set hive.enforce.bucketing=true; --寫入數(shù)據(jù)強制排序
set hive.enforce.sorting=true; --開啟bucketmapjoin
set hive.optimize.bucketmapjoin = true; --開啟SMB Join
set hive.auto.convert.sortmerge.join=true;
set hive.auto.convert.sortmerge.join.noconditionaltask=true;
開啟MapJoin的配置
(hive.auto.convert.join和hive.auto.convert.join.noconditionaltask.size),
還有限制對桶表進行l(wèi)oad操作(hive.strict.checks.bucketing)可以直接設(shè)置在hive的配置項中,無需在sql中聲明。
自動嘗試SMB聯(lián)接(hive.optimize.bucketmapjoin.sortedmerge)也可以在設(shè)置中進行提前配置。
2.講一講Hive索引
Hive支持索引,但是Hive的索引與關(guān)系型數(shù)據(jù)庫中的索引并不相同,比如,Hive不支持主鍵或者外鍵。
Hive索引可以建立在表中的某些列上,以提升一些操作的效率,例如減少MapReduce任務(wù)中需要讀取的數(shù)據(jù)塊的數(shù)量。
在可以預(yù)見到分區(qū)數(shù)據(jù)非常龐大的情況下,分桶和索引常常是優(yōu)于分區(qū)的。而分桶由于SMB
Join對關(guān)聯(lián)鍵要求嚴格,所以并不是總能生效。
Hive的索引目的是提高Hive表指定列的查詢速度。
沒有索引時,類似'WHERE tab1.col1 = 10' 的查詢,Hive會加載整張表或分區(qū),然后處理所有的rows,但是如果在字段col1上面存在索引時,那么只會加載和處理文件的一部分。
在每次建立、更新數(shù)據(jù)后,Hive索引不會自動更新,需要手動進行更新(重建索引以構(gòu)建索引表),會觸發(fā)一個mr job。
Hive索引使用過程繁雜,而且性能一般,在Hive3.0中已被刪除,在工作環(huán)境中不推薦優(yōu)先使用,在分區(qū)數(shù)量過多或查詢字段不是分區(qū)字段時,索引可以作為補充方案同時使用。推薦使用ORC文件格式的索引類型進行查詢。