hive嚴格模式
hive提供了乙個嚴格模式,可以防止使用者執行那些可能產生意想不到的不好的效果的查詢。即某些查詢在嚴格
模式下無法執行。通過設定hive.mapred.mode的值為strict,可以禁止3中型別的查詢。
1)帶有分割槽的表的查詢
如果在乙個分割槽表執行hive,除非where語句中包含分割槽字段過濾條件來顯示資料範圍,否則不允許執行。換句話說,
就是使用者不允許掃瞄所有的分割槽。進行這個限制的原因是,通常分割槽表都擁有非常大的資料集,而且資料增加迅速。
如果沒有進行分割槽限制的查詢可能會消耗令人不可接受的巨大資源來處理這個表:
hive> select distinct(planner_id) from fracture_ins where planner_id=5;
failed: error in semantic analysis: no partition predicate found for alias "fracture_ins" table "fracture_ins
如下這個語句在where語句中增加了乙個分割槽過濾條件(也就是限制了表分割槽):
hive> select distinct(planner_id) from fracture_ins
> where planner_id=5 and hit_date=20120101;
... normal results ...
只需要增加limit語句就可以解決這個問題:
hive> select * from fracture_ins where hit_date>2012 order by planner_id
> limit 100000;
... normal results ...
3)限制笛卡爾積的查詢
對關係型資料庫非常了解的使用者可能期望在執行join查詢的時候不使用on語句而是使用where語句,這樣關聯式資料庫的執行
優化器就可以高效的將where語句轉換成那個on語句。不幸的是,hive不會執行這種優化,因此,如果表足夠大,那麼這個查詢就會
出現不可控的情況:
hive> select * from fracture_act join fracture_ads
> where fracture_act.planner_id = fracture_ads.planner_id;
failed: error in semantic analysis: in strict mode, cartesian product
is not allowed. if you really want to perform the operation,
+set hive.mapred.mode=nonstrict+
下面這個才是正確的使用join和on語句的查詢:
hive> select * from fracture_act join fracture_ads
> on (fracture_act.planner_id = fracture_ads.planner_id);
... normal results ...
hive 嚴格模式
hive提供了乙個嚴格模式,可以防止使用者執行那些可能產生意向不到的不好的效果的查詢。說通俗一點就是這種模式可以阻止某些查詢的執行。通過如下語句設定嚴格模式 hive set hive.mapred.mode strict hive select distinct planner id from f...
hive嚴格模式
hive嚴格模式 hive提供了乙個嚴格模式,可以防止使用者執行那些可能產生意想不到的不好的效果的查詢。即某些查詢在嚴格 模式下無法執行。1 帶有分割槽的表的查詢 如果在乙個分割槽表執行hive,除非where語句中包含分割槽字段過濾條件來顯示資料範圍,否則不允許執行。換句話說,就是使用者不允許掃瞄...
hive嚴格模式
說真的,這個模式在我做sql開發的歲月裡,從未用到過。用的都是動態分割槽非嚴格模式。我的好友東嶽同學在車上問我。確實問到了我 體現出了我基本功不紮實的情況。hive提供了乙個嚴格模式,可以防止使用者執行那些可能產生意向不到的不好的效果的查詢。說通俗一點就是這種模式可以阻止某些查詢的執行。通過如下語句...