Hive Join特殊点
1.标准SQL是支持对连接关键词进行非等值连接的,但是在hive中不支持,同时也不支持在on中使用or,主要原因是mapreduce很难实现这种类型的连接
2.Hive中不支持大多数SQL中的in .... exists,可以使用left semi-join代替
Join优化
大多数情况下,hive会对每对join连接对象启动一个mapreduce任务。例如a join b on a.id=b.id join c on a.id =c.id,这是首先对表a和b启动一个map-reduce任务,然后对于这个集合和表c启动一个map-reduce任务。
优化
1.当多个表进行join连接时,如果每个on子句都使用相同的连接键,只会产生一个map-reduce。这里指主表的关联字段不变,从表字段命名变化不影响
2.hive同时假定查询的最后一个表是最大的表,然后连接操作时将其他表缓存起来,扫描最后的表进行计算,所以用户需要尽可能的保证查询的表是越来越大的。可以使用/*+streamtable(表名)*/指定最大的表。
3.笛卡尔积是无法优化的
4.当连接的表中只有一张是小表,那么可以将小表完全放在内存中,可以减少map的代价,减少reduce,使用/*+mapjoin(表名)*/即map-side join。在hive v0.7之后,可以不使用这个hint,但是需要设置参数hive.auto.convert.JOIN=true来开启这个功能,不过在right left join 和full outer join中不支持这个功能。用户还可以配置能够使用这个优化的小表的大小,参数为hive.mapjoin.smalltable.filesizez
5.
join(inner join) full outer join 谓词写哪里无所谓
left outer join 右边的表写在on后面,左边的写在where后面
right outer join 左边的表写在on后面,右边的写在where后面
或者全部做成子查询
网友评论