1. 程式人生 > >hive的嚴格模式

hive的嚴格模式

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 ...


 2)帶有orderby的查詢
         對於使用了orderby的查詢,要求必須有limit語句。因為orderby為了執行排序過程會講所有的結果分發到同一個reducer中
  進行處理,強烈要求使用者增加這個limit語句可以防止reducer額外執行很長一段時間:
hive> SELECT * FROM fracture_ins WHERE hit_date>2012 ORDER BY planner_id;
FAILED: Error in semantic analysis: line 1:56 In strict mode,
limit must be specified if ORDER BY is present planner_id


        只需要增加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 ...

相關推薦

no