嚴(yán)格模式
Hive提供了一個(gè)嚴(yán)格模式,可以防止用戶執(zhí)行那些可能意向不到的不好的影響的查詢。
通過設(shè)置屬性hive.mapred.mode值為默認(rèn)是非嚴(yán)格模式nonstrict。開啟嚴(yán)格模式需要修改hive.mapred.mode值為strict,開啟嚴(yán)格模式可以禁止3種類型的查詢。
<property>
<name>hive.mapred.mode</name>
<value>strict</value>
<description>
The mode in which the Hive operations are being performed.
In strict mode, some risky queries are not allowed to run. They include:
Cartesian Product.
No partition being picked up for a query.
Comparing bigints and strings.
Comparing bigints and doubles.
Orderby without limit.
</description>
</property>
1)對(duì)于分區(qū)表,除非where語句中含有分區(qū)字段過濾條件來限制范圍,否則不允許執(zhí)行。換句話說,就是用戶不允許掃描所有分區(qū)。進(jìn)行這個(gè)限制的原因是,通常分區(qū)表都擁有非常大的數(shù)據(jù)集,而且數(shù)據(jù)增加迅速。沒有進(jìn)行分區(qū)限制的查詢可能會(huì)消耗令人不可接受的巨大資源來處理這個(gè)表。
2)對(duì)于使用了order by語句的查詢,要求必須使用limit語句。因?yàn)閛rder by為了執(zhí)行排序過程會(huì)將所有的結(jié)果數(shù)據(jù)分發(fā)到同一個(gè)Reducer中進(jìn)行處理,強(qiáng)制要求用戶增加這個(gè)LIMIT語句可以防止Reducer額外執(zhí)行很長一段時(shí)間。
3)限制笛卡爾積的查詢。對(duì)關(guān)系型數(shù)據(jù)庫非常了解的用戶可能期望在執(zhí)行JOIN查詢的時(shí)候不使用ON語句而是使用where語句,這樣關(guān)系數(shù)據(jù)庫的執(zhí)行優(yōu)化器就可以高效地將WHERE語句轉(zhuǎn)化成那個(gè)ON語句。不幸的是,Hive并不會(huì)執(zhí)行這種優(yōu)化,因此,如果表足夠大,那么這個(gè)查詢就會(huì)出現(xiàn)不可控的情況。