Hive之——Join操作

本文通过具体的示例数据,展示了如何使用Hive SQL中的不同类型的JOIN操作,包括内连接、左外连接、右外连接、半连接及全外连接等,并提供了每种连接方式的运行结果。

转载请注明出处:http://blog.csdn.net/l1028386804/article/details/78308571

两个字段,第一个字段是学生名字,第二个是所选课程的ID号,表名叫stu

name courseId
zs1,1
zs2,2
zs3,3
zs4,4

create table stu(name string, id int) row format delimited fields terminated by ',';
load data local inpath '/home/zkpk/test/hivetest/join/stu.txt' into table stu;

课程表course,第一个字段是课程的ID号,第二个是课程的名字

courseId courseName
2,math
3,english
5,chinese
6,physic
create table course(id int comment 'course id number', courseName string comment 'course name') row format delimited fields terminated by ',';
load data local inpath '/home/zkpk/test/hivetest/join/course.txt' into table course;
1、inner join

select stu.name, stu.id, course.coursename from stu join course on stu.id=course.id;
select stu.name, stu.id, course.coursename from stu inner join course on stu.id=course.id;

2、left outer join

select stu.name, stu.id, course.coursename from stu left outer join course on stu.id=course.id;

3、right outer join

select stu.name, course.id, course.coursename from stu right outer join course on stu.id=course.id;

4、Left semi join


left semi join 的运行结果:

Total MapReduce CPU Time Spent: 1 seconds 30 msec
OK
zs2	2
zs3	3

inner join 的运行结果:

Total MapReduce CPU Time Spent: 1 seconds 40 msec
OK
zs2	2	math
zs3	3	english

full outer join
select stu.name, stu.id, course.id, course.coursename from stu full outer join course on stu.id=course.id;
5、full outer join

select stu.name, stu.id, course.id, course.coursename from stu full outer join course on stu.id=course.id;


### Hive FULL JOIN 使用方法 在Hive中,`FULL JOIN`是一种连接操作,它会返回左表和右表中的所有记录。如果某张表中不存在匹配,则结果集中相应的列将包含NULL值。 对于涉及多个表的情况,可以使用如下SQL语句来执行带有多个关联键的`FULL JOIN`: ```sql SELECT * FROM tmp.tmp_fulljoin_tablea a FULL JOIN tmp.tmp_fulljoin_tableb b ON a.key1 = b.key1 FULL JOIN tmp.tmp_fulljoin_tablec c ON COALESCE(a.key1, b.key1) = c.key1; ``` 上述代码展示了如何基于共同的关键字`key1`对三个不同的临时表进行完全外联接[^4]。 当处理两个具体业务逻辑相关的表时,比如员工信息表与薪资详情表之间的关系,可以通过公共字段如ID来进行完整的外部链接,从而获取到即使一方缺失另一方存在的全部记录条目。 需要注意的是,在实际应用过程中应当谨慎对待`FULL JOIN`的选择,因为这可能会导致大量的笛卡尔积运算,进而影响性能表现。因此建议仅在确实需要保留两侧不匹配的数据项的情况下才采用这种方式[^2]。 为了更好地理解并掌握这一概念,下面给出一个更贴近现实场景的例子:假设有两张分别存储用户基本信息(`ods_user_info`)及其每日活动增量更新(`ods_user_inc`)的日志表格,现在希望通过一次性的查询获得每位用户的最新状态概览(无论该用户当天是否有新的变动),此时就可以利用`FULL JOIN`完成此需求。 ```sql CREATE TABLE IF NOT EXISTS ods_user_info ( uid BIGINT, uname STRING, deptno BIGINT, gender STRING ); CREATE TABLE IF NOT EXISTS ods_user_inc( uid BIGINT, uname STRING, deptno BIGINT, gender STRING, optime DATETIME ); -- 查询每个用户的当前情况,包括那些今天没有任何改变的人 SELECT i.uid AS info_uid, inc.uid AS inc_uid, i.uname, i.deptno, i.gender, inc.optime FROM ods_user_info i FULL OUTER JOIN ods_user_inc inc ON i.uid = inc.uid; ``` 这段脚本首先定义了两个模拟使用的表结构,接着通过一条简单的`FULL OUTER JOIN`命令实现了预期的功能——既包含了已有账户列表也涵盖了当日新增或修改过的实例[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冰 河

可以吃鸡腿么?

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值