当前位置: 首页 > article >正文

Hive中各种Join的实现

一. 数据准备
1. 创建两张表
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文件数据如下:

1,huangbo
2,xuzheng
4,wangbaoqiang
6,huangxiaoming
7,fengjie
10,liudehua

tableb.txt 文件数据如下:

2,20
4,50
7,80
10,22
12,33
15,44
3. 将数据导入对应的表中
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 就是取两表的交集

select * from tablea a inner join tableb b on a.id = b.id;

结果:

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

select * from tablea a left join tableb b on a.id = b.id;

结果:

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

select * from tablea a right join tableb b on a.id = b.id;

结果:

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

select * from tablea a full outer join tableb b on a.id = b.id;

结果:

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的实现语句如下:

-- 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);

运行结果:

2       xuzheng
4       wangbaoqiang
7       fengjie
10      liudehua

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

select * from tablea a left semi join tableb b on a.id = b.id;

运行结果:

2       xuzheng
4       wangbaoqiang
7       fengjie
10      liudehua

http://www.kler.cn/a/384545.html

相关文章:

  • Java字符串深度解析:String的实现、常量池与性能优化
  • 企业文件加密要怎么做?好用的10款企业文件加密软件排行榜!
  • 2款使用.NET开发的数据库系统
  • Kafka java 配置
  • 企业级-实现Redis封装层
  • 使用sealos部署的集群在部署metrics-server时日志x509
  • Windows系统使用OpenSSL生成自签名证书
  • pnpm管理多工作区依赖
  • Oracle-日期转换
  • 数据结构-数组(稀疏矩阵转置)和广义表
  • 【全网最新】Pycharm安装 并完成正常使用 Anaconda3最新版安装教程 搭配Pycharm 调试Anaconda3
  • Django设计响应数据结构
  • web前端
  • navicat pg库安装mysql fdw 外表扩展
  • Call For Speaker! |2025中国国际音频产业大会(GAS)演讲嘉宾征集令启动!
  • 后端Node学习项目-项目基础搭建
  • linux下linuxdeployqt打包过程
  • Xserver v1.4.2发布,支持自动重载 nginx 配置
  • Golang--协程和管道
  • 飞腾平台Arm ComputeLibrary编译安装指南
  • canal1.1.7使用canal-adapter进行mysql同步数据
  • springboot 传统应用程序,适配云原生改造
  • SSH僵尸主机挖矿木马预警
  • 群控系统服务端开发模式-应用开发-腾讯云上传工厂及七牛云上传工厂开发
  • 从Apache Atlas到Aloudata BIG,数据血缘解析有何改变?
  • redis时间优化