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