大数据学习之路35-hive的join

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_37050372/article/details/81901856
select

join

inner join

left join  == left outer join

right join == right outer join

full outer join

我们先来创建数据和表:

内连接(内连接的本质其实是取笛卡尔集):

select a.*,b.* from t_a a join t_b b on a.id = b.id;

左外连接:

select a.*,b.* from t_a a left join t_b b on a.id = b.id;

右外连接:

select a.*,b.* from t_a a right join t_b b on a.id = b.id;

全外连接:

select a.*,b.* from t_a a full join t_b b on a.id = b.id;

半连接:

我们先来对比一下:

select a.* from t_a a  join t_b b on a.id = b.id

这里是查出左边的一半:

select a.* from t_a a left  semi join t_b b on a.id = b.id;

我们可以看到上面使用内连接查询左边的一半用了6.639秒,而使用半连接用时5.133秒效率明显提高了。

所以如果我们只想查询一半的数据可以使用semi半连接来提高mapreduce的效率。

这是为什么呢?因为如果我们使用内连接来查询一半的话,它会把两张表的数据都发送到reduce端做聚合,而使用semi半连接,则不会发送所有的数据。

不等值查询:

select a.*,b.* from t_a a  join t_b b on a.id > b.id;

select a.*,b.* from t_a a , t_b b where a.id > b.id;

在老版本中,不支持非等值的join

在1.2.1后都支持非等值join,不过写法应该如下:

select a.*,b.* from t_a a , t_b b where a.id > b.id;

不支持的语法:

select a.*,b.* from t_a a join t_b b on a.id > b.id;

猜你喜欢

转载自blog.csdn.net/qq_37050372/article/details/81901856