hive内联接和外联接
Posted rensui4726
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hive内联接和外联接相关的知识,希望对你有一定的参考价值。
hql很多语句和sql有相似之处,下面用例子快速了解内外联接的用法
在多表操作的时候,经常会遇到需要的数据,一部分存在a表,一部分存在b表,或者存在更多的表中。
而我们可以从这些表的关系进行联接,下面创建两个表进行实例演示:
首先创建一个学生信息表,有id,s_name,c_name三个属性
hive> create table stu_msg( > id string, > s_name string, > c_name string) > row format delimited > fileds terminated by ‘,‘ > ;
再创建一个成绩表,有id,score两种属性
hive> create table score_msg( > id string > ,score int) > row format delimited > fields terminated by ‘,‘ > lines terminated by ‘\\n‘;
添加对应数据于两表之中:
insert into table stu_msg values(‘1‘,‘zhangsan‘,‘math‘),(‘2‘,‘lisi‘,‘english‘),(‘3‘,‘wangwu‘,‘history‘); insert into table score_msg values(‘1‘,99),(‘3‘,88),(‘4‘,66);
在两个表之间,不难发现学生表的id和成绩表的id存在关系,所以我们可以通过二者的关系进行联接查询。
一、首先是内联接(通过指定关系对A和B表进行匹配,把能匹配到的结果进行返回,匹配不到的则不返回):
select stu_msg.*,score_msg.* from stu_msg inner join score_msg on stu_msg.id=score_msg.id;
返回结果就是id为1和2的学生信息和成绩,为什么3的信息和4的成绩不返回呢?
因为在学生表中,id为3的学生在成绩表中并没有信息,所以匹配不到对应数据,而id为4的学生在学生表中却没有信息,只有成绩,也同样无法进行匹配,而内联接中,无法匹配的就不会查询返回出来。
二、外联接(左联接,右联接,完全联接...)
1、左连接:
select stu_msg.*,score_msg.* from stu_msg left join score_msg on stu_msg.id=score_msg.id;
返回结果:
不难发现,学生表的数据全部返回,而成绩表的数据id为4的同学依然没有打印出来,而且结果还有两个空值。
以left join 为中心,stu_msg为左侧表,而score_msg为右侧表,左联接就是通过以左表对指定属性进行匹配,不管匹配是否成功,左表数据全部返回,而右表数据只返回被成功匹配的。
空值是因为,左表数据没有对应的数据进行匹配,就以null来代替。
2、反之右联接的结果如下:
select stu_msg.*,score_msg.* from stu_msg right join score_msg on stu_msg.id=score_msg.id;
3、完全联接:
select stu_msg.*,score_msg.* from stu_msg full join score_msg on stu_msg.id=score_msg.id;
以上是关于hive内联接和外联接的主要内容,如果未能解决你的问题,请参考以下文章