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
相关推荐
时差9532 小时前
【面试题】Hive 查询:如何查找用户连续三天登录的记录
大数据·数据库·hive·sql·面试·database
静听山水2 小时前
Hive:UDTF 函数
hive
EDG Zmjjkk3 小时前
Hive 查询(详细实操版)
数据仓库·hive·hadoop
lzhlizihang4 小时前
【Hive sql 面试题】求出各类型专利top 10申请人,以及对应的专利申请数(难)
大数据·hive·sql·面试题
Hsu_kk4 小时前
Hive 查询各类型专利 Top 10 申请人及对应的专利申请数
数据仓库·hive·hadoop
静听山水4 小时前
Hive 的数据存储单元结构
hive
大数据编程之光4 小时前
Hive 查询各类型专利 top10 申请人及专利申请数
大数据·数据仓库·hive·hadoop
杰克逊的日记4 小时前
Hive详解
数据仓库·hive·hadoop
上辈子杀猪这辈子学IT5 小时前
【Zookeeper集群搭建】安装zookeeper、zookeeper集群配置、zookeeper启动与关闭、zookeeper的shell命令操作
linux·hadoop·zookeeper·centos·debian