1、join連接時(shí)的優(yōu)化_當(dāng)三個(gè)或多個(gè)以上的表進(jìn)行join操作時(shí),如果每個(gè)on使用相同的字段連接時(shí)只會(huì)產(chǎn)生一個(gè)mapreduce。
2、join連接時(shí)的優(yōu)化_當(dāng)多個(gè)表進(jìn)行查詢時(shí),從左到右表的大小順序應(yīng)該是從小到大。原因_hive在對(duì)每行記錄操作時(shí)會(huì)把其他表先緩存起來(lái),直到掃描最后的表進(jìn)行計(jì)算
3、在where字句中增加分區(qū)過(guò)濾器。
4、當(dāng)可以使用left semi join語(yǔ)法時(shí)不要使用inner join,前者效率更高。原因_對(duì)于左表中指定的一條記錄,一旦在右表中找到立即停止掃描。
5、如果所有表中有一張表足夠小,則可置于內(nèi)存中,這樣在和其他表進(jìn)行連接的時(shí)候就能完成匹配,省略掉reduce過(guò)程。
設(shè)置屬性即可實(shí)現(xiàn),
set hive.auto.covert.join_true;
用戶可以配置希望被優(yōu)化的小表的大小
set hive.mapjoin.smalltable.sia_2500000;如果需要使用這兩個(gè)配置可置入$HOME/.hiverc文件中。
6、同一種數(shù)據(jù)的多種處理_從一個(gè)數(shù)據(jù)源產(chǎn)生的多個(gè)數(shù)據(jù)聚合,無(wú)需每次聚合都需要重新掃描一次。
例如_
insert overwrite table student select * from employee;
insert overwrite table person select * from employee;
可以優(yōu)化成_
from employee
insert overwrite table student select *
insert overwrite table person select *
7、limit調(diào)優(yōu)_limit語(yǔ)句通常是執(zhí)行整個(gè)語(yǔ)句后返回部分結(jié)果。
Set hive.limit.optimia.enable_true;
8、開(kāi)啟并發(fā)執(zhí)行。某個(gè)job任務(wù)中可能包含眾多的階段、其中某些階段沒(méi)有依賴關(guān)系可以并發(fā)執(zhí)行,開(kāi)啟并發(fā)執(zhí)行后job任務(wù)可以更快的完成。
設(shè)置屬性_
set hive.e>ecparallel_true;
9、hive提供的嚴(yán)格模式,禁止3種情況下的查詢模式。
a_當(dāng)表為分區(qū)表時(shí),where字句后沒(méi)有分區(qū)字段和限制時(shí),不允許執(zhí)行。
b_當(dāng)使用order by語(yǔ)句時(shí),必須使用limit字段,因?yàn)閛rder by只會(huì)產(chǎn)生一個(gè)reduce任務(wù)。
c_限制笛卡爾積的查詢。