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
相关推荐
啊迷诺斯19 小时前
hadoop的常用命令
hadoop
SelectDB技术团队19 小时前
Apache Doris 2025 Roadmap:构建 GenAI 时代实时高效统一的数据底座
大数据·数据库·数据仓库·人工智能·ai·数据分析·湖仓一体
Loving_enjoy21 小时前
基于Hadoop的明星社交媒体影响力数据挖掘平台:设计与实现
大数据·hadoop·数据挖掘
weixin_3077791321 小时前
使用C#实现从Hive的CREATE TABLE语句中提取分区字段名和数据类型
开发语言·数据仓库·hive·c#
一个天蝎座 白勺 程序猿1 天前
大数据(4.6)Hive执行引擎选型终极指南:MapReduce/Tez/Spark性能实测×万亿级数据资源配置公式
大数据·hive·mapreduce
墨染丶eye2 天前
数据仓库项目启动与管理
大数据·数据仓库·spark
一个天蝎座 白勺 程序猿2 天前
大数据(4.5)Hive聚合函数深度解析:从基础统计到多维聚合的12个生产级技巧
大数据·hive·hadoop
浩浩kids2 天前
Hadoop•踩过的SHIT
大数据·hadoop·分布式
weixin_307779132 天前
C#实现HiveQL建表语句中特殊数据类型的包裹
开发语言·数据仓库·hive·c#
一个天蝎座 白勺 程序猿2 天前
大数据(4.2)Hive核心操作实战指南:表创建、数据加载与分区/分桶设计深度解析
大数据·hive·hadoop