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 字符串,而用空串代替