百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

hive如何实现不等值连接

bigegpt 2024-08-16 14:26 3 浏览

由于 hive 与传统关系型数据库面对的业务场景及底层技术架构都有着很大差异,因此,传统数据库领域的一些技能放到 Hive 中可能已不再适用。因为 hive 受限于 MapReduce 算法模型,只支持 equi-joins(等值 join),低版本的hive不支持非等值连接,那么如何实现非等值连接,今天我们就来讨论下!

一对一或一对多连接

1.准备数据

create table test1 
(
 id int
 ,age int
 ,name string
 ,sex string
 )
 ;
insert into test1 values
 (1,12,'zs','m')
 ,(2,15,'ls','m')
 ,(3,20,'ww','m')
 ,(4,20,'ll','f')
 ,(5,23,'xh','f')
;
create table test2 
 (
 id int
 ,age int
 ,name string
 ,class int
 )
 ;
 insert into test2 values
 (1,11,'zsang',1)
 ,(2,15,'lsa',1)
 ,(3,22,'ww',2)
 ,(4,40,'lling',1)
 ,(4,45,'llan',1)
 ,(5,25,'cxh',2)
;

2.想要实现以下需求:

1)
select 
 t1.id as id
 , t1.name as name1
 , t2.name as name2
 from test1 t1
left join test2 t2
 on t2.name like concat(t1.name,'%')
 and t1.name <> t2.name
;
2)
select 
 t1.id as id
 , t1.age as age1
 , t2.age as age2
 from test1 t1
left join test2 t2
 on t1.id=t2.id 
 and t1.age < t2.age
;

因为hive 不支持不等值连接,所以需要想办法来实现不等值连接,决定先过滤后关联

1)

select 
 t1.id 
 ,t1.name as name1 
 , t2.name as name2 
 from test1 t1
left join
 (
 select 
 t1.id
 ,t2.name
 from test1 t1
 inner join test2 t2
 where t2.name like concat(t1.name,'%')
 and t1.name <> t2.name
 ) t2
 on t1.id =t2.id
;

结果:

2)

select 
 t1.id
 ,t1.age as age1
 , t2.age as age2
 from test1 t1
left join
 (
 select 
 t1.id
 ,t2.age
 from test1 t1
 inner join test2 t2
 on t1.id =t2.id
 where t1.age < t2.age
 ) t2
 on t1.id =t2.id
;

结果:

以上方法只支持一对一或一对多的连接,如果多对多连接就不支持了

多对多连接

1.准备数据

在以上test1表中增加一条数据

insert into test1 values (4,30,'li','f')

此时test1中数据为:

select * from test1;

id age name sex

1 12 zs m

2 15 ls m

3 20 ww m

4 20 ll f

4 30 li f

5 23 xh f

;

select * from test2;

id age name class

1 11 zsang 1

2 15 lsa 1

3 22 ww 2

4 40 lling 1

4 45 llan 1

5 25 cxh 2

若还用上面方法来实现该需求的话

select 
 t1.id
 ,t1.age as age1
 , t2.age as age2
 from test1 t1
left join
 (
 select 
 t1.id
 ,t2.age
 from test1 t1
 inner join test2 t2
 on t1.id =t2.id
 where t1.age < t2.age
 ) t2
 on t1.id =t2.id
;

结果为:

id age1 age2

1 12 null

2 15 null

3 20 22

4 20 40

4 20 40

4 20 45

4 20 45

5 23 25

4 30 40

4 30 40

4 30 45

4 30 45

;

以上结果明显不对,那么该如何实现呢?

select 
 t1.id as id
 ,t1.age as age1
 ,case when t1.age < t2.age then t2.age else null end as age2
 from test1 t1
left join test2 t2
 on t1.id=t2.id 

结果:

这是我暂时想到的办法,如果大家有什么好的办法,欢迎留言评论,我也会将好的办法更新!!!

相关推荐

了解Linux目录,那你就了解了一半的Linux系统

大到公司或者社群再小到个人要利用Linux来开发产品的人实在是多如牛毛,每个人都用自己的标准来配置文件或者设置目录,那么未来的Linux则就是一团乱麻,也对管理造成许多麻烦。后来,就有所谓的FHS(F...

Linux命令,这些操作要注意!(linux命令?)

刚玩Linux的人总觉得自己在演黑客电影,直到手滑输错命令把公司服务器删库,这才发现命令行根本不是随便乱用的,而是“生死簿”。今天直接上干货,告诉你哪些命令用好了封神!喜欢的一键三连,谢谢观众老爷!!...

Linux 命令速查手册:这 30 个高频指令,拯救 90% 的运维小白!

在Linux系统的世界里,命令行是强大的武器。对于运维小白而言,掌握一些高频使用的Linux命令,能极大提升工作效率,轻松应对各种系统管理任务。今天,就为大家奉上精心整理的30个Linu...

linux必学的60个命令(linux必学的20个命令)

以下是Linux必学的20个基础命令:1.cd:切换目录2.ls:列出文件和目录3.mkdir:创建目录4.rm:删除文件或目录5.cp:复制文件或目录6.mv:移动/重命名文件或目录7....

提高工作效率的--Linux常用命令,能够决解95%以上的问题

点击上方关注,第一时间接受干货转发,点赞,收藏,不如一次关注评论区第一条注意查看回复:Linux命令获取linux常用命令大全pdf+Linux命令行大全pdf为什么要学习Linux命令?1、因为Li...

15 个实用 Linux 命令(linux命令用法及举例)

Linux命令行是系统管理员、开发者和技术爱好者的强大工具。掌握实用命令不仅能提高效率,还能解锁Linux系统的无限潜力,本文将深入介绍15个实用Linux命令。ls-列出目录内容l...

Linux 常用命令集合(linux常用命令全集)

系统信息arch显示机器的处理器架构(1)uname-m显示机器的处理器架构(2)uname-r显示正在使用的内核版本dmidecode-q显示硬件系统部件-(SMBIOS/DM...

Linux的常用命令就是记不住,怎么办?

1.帮助命令1.1help命令#语法格式:命令--help#作用:查看某个命令的帮助信息#示例:#ls--help查看ls命令的帮助信息#netst...

Linux常用文件操作命令(linux常用文件操作命令有哪些)

ls命令在Linux维护工作中,经常使用ls这个命令,这是最基本的命令,来写几条常用的ls命令。先来查看一下使用的ls版本#ls--versionls(GNUcoreutils)8.4...

Linux 常用命令(linux常用命令)

日志排查类操作命令查看日志cat/var/log/messages、tail-fxxx.log搜索关键词grep"error"xxx.log多条件过滤`grep-E&#...

简单粗暴收藏版:Linux常用命令大汇总

号主:老杨丨11年资深网络工程师,更多网工提升干货,请关注公众号:网络工程师俱乐部下午好,我的网工朋友在Linux系统中,命令行界面(CLI)是管理员和开发人员最常用的工具之一。通过命令行,用户可...

「Linux」linux常用基本命令(linux常用基本命令和用法)

Linux中许多常用命令是必须掌握的,这里将我学linux入门时学的一些常用的基本命令分享给大家一下,希望可以帮助你们。总结送免费学习资料(包含视频、技术学习路线图谱、文档等)1、显示日期的指令:d...

Linux的常用命令就是记不住,怎么办?于是推出了这套教程

1.帮助命令1.1help命令#语法格式:命令--help#作用:查看某个命令的帮助信息#示例:#ls--help查看ls命令的帮助信息#netst...

Linux的30个常用命令汇总,运维大神必掌握技能!

以下是Linux系统中最常用的30个命令,精简版覆盖日常操作核心需求,适合快速掌握:一、文件/目录操作1.`ls`-列出目录内容`ls-l`(详细信息)|`ls-a`(显示隐藏文件)...

Linux/Unix 系统中非常常用的命令

Linux/Unix系统中非常常用的命令,它们是进行文件操作、文本处理、权限管理等任务的基础。下面是对这些命令的简要说明:**文件操作类:*****`ls`(list):**列出目录内容,显...