hiveQL 優化

baiyunl發表於2011-01-13

1.當hive執行join記憶體溢位時,可以修改hive的配置檔案hive-site.xml,增大記憶體,如下: mapred.child.java.opts -Xmx 1024m

2.hive預設建表時的路徑也可以在hive-site.xml裡配置,如下: hive.metastore.warehouse.dir value >/user/hive/warehouse description >location of default database for the warehouse

3.執行join操作的時候,儘量把小表放前面,大表放前面可能會因為記憶體溢位而出錯

4.對分割槽表進行操作需要對分割槽進行過濾(如:ds=$yday)。 特別是在JOIN操作的時候,分割槽過濾(如:ds=$yday)需要放到 ON語句 或子查詢 裡面。不能放到ON後面的WHERE裡,這樣會掃描所有表,最後才判斷分割槽。也就是說程式會先執行JOIN操作,才會執行最後的WHERE操作。

5.在JOIN操作中,後面被連續JOIN且同一欄位,只會執行一個mapreduce操作。 SELECT * FROM a LEFT OUTER JOIN b ON a.t=b.t LEFT OUTER JOIN c ON a.t=c.t; 推薦的 SELECT * FROM a LEFT OUTER JOIN b ON a.t=b.t LEFT OUTER JOIN c ON b.t=c.t; 效率低下的

6.當一個大表和一個很小的表進行JOIN操作的時候,使用MAPJOIN操作,這樣會把小表讀入記憶體進行JOIN,只需要一個map操作JOIN就完成了 select /*+ mapjoin(a)*/ a.c1,b.c2,b.c3 from a join b on a.c4=b.c4;

7.通過設定hive.merge.mapfiles可以關閉hive對於掃描表的優化,但有時候會提高效率。預設值為true。可以視情況設定:只含有SELECT的語句 或 MAPJOIN 推薦使用

8.ALTER TABLE a SET SERDEPROPERTIES('serialization.null.format' = ''); 可以使結果表不出現\N字串,而用空串代替

相關文章