Hive中各种Join的实现

一. 数据准备
1. 创建两张表
sql 复制代码
create table tablea (id int, name string) row format delimited fields terminated by ',';
create table tableb (id int, age int) row format delimited fields terminated by ',';
2. 准备两份数据

tablea.txt文件数据如下:

bash 复制代码
1,huangbo
2,xuzheng
4,wangbaoqiang
6,huangxiaoming
7,fengjie
10,liudehua

tableb.txt 文件数据如下:

bash 复制代码
2,20
4,50
7,80
10,22
12,33
15,44
3. 将数据导入对应的表中
sql 复制代码
load data local inpath '/root/tablea.txt' into table tablea;
load data local inpath '/root/tableb.txt' into table tableb;
二. JOIN实现
1. inner join(内连接)

inner join 就是取两表的交集

sql 复制代码
select * from tablea a inner join tableb b on a.id = b.id;

结果:

bash 复制代码
2       xuzheng 2       20
4       wangbaoqiang    4       50
7       fengjie 7       80
10      liudehua        10      22
2. left outer join (左外连接)

left outer join是以左表基准,右表不存在的key均赋值为null

sql 复制代码
select * from tablea a left join tableb b on a.id = b.id;

结果:

bash 复制代码
1       huangbo NULL    NULL
2       xuzheng 2       20
4       wangbaoqiang    4       50
6       huangxiaoming   NULL    NULL
7       fengjie 7       80
10      liudehua        10      22
3. right outer join(右外连接)

right outer join以右表基准,左表不存在的key均赋值为null

sql 复制代码
select * from tablea a right join tableb b on a.id = b.id;

结果:

bash 复制代码
2       xuzheng 2       20
4       wangbaoqiang    4       50
7       fengjie 7       80
10      liudehua        10      22
NULL    NULL    12      33
NULL    NULL    15      44
4. full outer join(全外连接)

full outer join 是对左右两表求并集,两个表中不存在的key均赋值null

sql 复制代码
select * from tablea a full outer join tableb b on a.id = b.id;

结果:

bash 复制代码
1       huangbo NULL    NULL
2       xuzheng 2       20
4       wangbaoqiang    4       50
6       huangxiaoming   NULL    NULL
7       fengjie 7       80
10      liudehua        10      22
NULL    NULL    12      33
NULL    NULL    15      44
5. left semi join(左半连接)

left semi join返回两个表交集中左表的部分,Hive低版本中没有实现标准SQL中exist, in,因此它最主要的使用场景就是替代exist与in。

需求:

找出tablea表在tableb表中同时存在的id的记录,这个需求用IN和EXISTS的实现语句如下:

sql 复制代码
-- IN
select * from tablea where id in (select id from tableb);
-- EXISTS
select * from tablea  where exists (select * from tableb where tablea.id = tableb.id);

运行结果:

bash 复制代码
2       xuzheng
4       wangbaoqiang
7       fengjie
10      liudehua

这个需求在Hive低版本中可以使用left semi join实现,同时可以获得更好的性能。

sql 复制代码
select * from tablea a left semi join tableb b on a.id = b.id;

运行结果:

bash 复制代码
2       xuzheng
4       wangbaoqiang
7       fengjie
10      liudehua
相关推荐
一个数据大开发2 小时前
数据资产价值及其实现路径-简答题回顾
大数据·数据仓库·数据
viperrrrrrrrrr75 小时前
大数据学习(112)-HIVE中的窗口函数
hive·sql·学习
酷爱码10 小时前
如何通过python连接hive,并对里面的表进行增删改查操作
开发语言·hive·python
Debug_TheWorld12 小时前
Hive学习
hive
weixin_3077791315 小时前
Azure Data Factory ETL设计与调度最佳实践
数据仓库·性能优化·云计算·azure·etl
元63317 小时前
spark和hadoop之间的对比和联系
大数据·hadoop·spark
哥不是小萝莉19 小时前
Hadoop和Spark大数据挖掘与实战
hadoop·ai·spark
lix的小鱼21 小时前
spark和Hadoop之间的对比和联系
大数据·hadoop·spark
晴天彩虹雨1 天前
Flink 数据清洗与字段标准化最佳实践
大数据·数据仓库·flink
TTBIGDATA1 天前
如何将 Apache Hudi 接入 Ambari?完整部署与验证指南
大数据·hadoop·ambari·hudi·bigtop·湖仓·自定义组件集成