Hive优化提示-如何写好HQL

一、    Hive join优化
 
1.    尽量将小表放在join的左边,我们这边使用的hive-0.12.0,所以是自动转化的,既把小表自动装入内存,执行map side join(性能好), 这是由参数hive.auto.convert.join=true 和hive.smalltable.filesize=25000000L)参数控制(默认是25M),如果表文件大小在25M左右,可以适当调整此参数,进行map side join,避免reduce side join。 也可以显示声明进行map join:特别适用于小表join大表的时候,SELECT /*+ MAPJOIN(b) */ a.key, a.value FROM a join b on a.key = b.key
 
2.    注意带表分区的join, 如:
 
SELECT a.val, b.val FROM a LEFT OUTER JOIN b ON (a.key=b.key) WHERE a.dt='2014-08-07' AND b.dt='2014-08-07'
 
因为hive是先join再where的,所以如果在b中找不到a表的记录,b表中的所以列都会列出null,包括ds列,这样left outer的查询结果与where子句无关了,解决办法:
 
SELECT a.val, b.val FROM a LEFT OUTER JOIN b ON (a.key=b.key AND a.dt='2014-08-07' AND b.dt='2014-08-07'')
 
3.    怎样写exist/in子句?
 
Hive不支持where子句中的子查询,SQL常用的exist in子句需要改写。这一改写相对简单。考虑以下SQL查询语句:
 
SELECT a.key, a.value  FROM a  WHERE a.key in  (SELECT b.key  FROM B);
 
可以改写为
 
SELECT a.key, a.value  FROM a LEFT OUTER JOIN b ON (a.key = b.key)  WHERE b.key <> NULL;
 
一个更高效的实现是利用left semi join改写为:
 
SELECT a.key, a.val  FROM a LEFT SEMI JOIN b on (a.key = b.key);
 
4.    Hive join只支持等值连接,不支持非等值连接。
 
5.    合理的使用map join, 场合:小表A join 大表,

Hive 的详细介绍:请点这里
Hive 的下载地址:请点这里

相关推荐