HiveQL學習

1.hive執行join內存溢出時,可以修改hive的配置文件hive-site.xml,增大內存,如下:
  • < property >
  • < name >mapred.child.java.opts< /name >
  • < value >-Xmx 1024m < /value >
  • < /property >
2.hive默認建表時的路徑也可以在hive-site.xml裏配置,如下:
  • < property >
  • < name >hive.metastore.warehouse.dir< /name >
  • < value >/user/hive/warehouse< /value >
  • < description >location of default database for the warehouse< /description >
  • < /property >
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字符串,而用空串代替
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章