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
字符串,而用空串代替
转载于:https://blog.51cto.com/richiehu/386109