Hive实现查询左表有右表没有的记录

工作中遇到这样一个场景,业务逻辑是:如果一个主体发生了某一问题,就不再统计该主体的其他问题。

思路:首先想到的方法就是not in方法,但是Hive并不不支持。那么使用left join对两个表进行连接,右表主键为空的说明是右表不存在坐标存在。

方法一:left join方法

left join返回左表所有的记录和右表on条件可以匹配到的数据,右表匹配不到的字段值为空值。并支持查询左表和右表的相关字段。

sql 复制代码
select
	t1.id,
	t1.field_one,
	t1.field_two,
	t2.field_three,
	t2.field_four
from 
	dbname.tableName1 t1
left join
	dbname.tableName2 t2
on t1.id = t2.id
where t2.id is null
方法二:left anti join方法

left anti join方法返回左表有而右表没有的数据,这种方法避免在join之后使用where条件删除不符合的数据,查询速度相对快点,但是注意left anti join不支持查询右表字段,所以只能select左表字段。

sql 复制代码
select
	t1.id,
	t1.field_one,
	t1.field_two,
from 
	dbname.tableName1 t1
left anti join
	dbname.tableName2 t2
on t1.id = t2.id

返回左表和右表同时存在的记录

考虑到可能会有另一种场景:要求查询左表和右表同时存在的记录,可以进行一下变换套用。

方法一:left join
sql 复制代码
select
	t1.id,
	t1.field_one,
	t1.field_two,
	t2.field_three,
	t2.field_four
from 
	dbname.tableName1 t1
left join
	dbname.tableName2 t2
on t1.id = t2.id
where t2.id is not null
方法二:left semi join

left semi join方法返回左表和右表同时存在的数据,但是不支持查询右表字段,另外如果左表有id重复的记录可能会返回第一条记录(返回记录数会和左表记录数不一致),有时不满足业务需求

sql 复制代码
select
	t1.id,
	t1.field_one,
	t1.field_two,
from 
	dbname.tableName1 t1
left semi join
	dbname.tableName2 t2
on t1.id = t2.id
相关推荐
yumgpkpm1 小时前
Acceldata ODP(Open Data Platform)3.3.6.4(RHEL9)保姆级完整安装手册
大数据·人工智能·hive·hadoop·kafka·hbase·cloudera
sunxunyong2 小时前
hs2偶发连接失败问题处理
hadoop
陈年老古董5 小时前
Hive 函数学习笔记(上):单行函数与炸裂函数
hive·笔记·学习
真上帝的左手8 小时前
27. 数据产品-数据中台架构规划
数据仓库·架构·数据分析·数据中台
陈年老古董10 小时前
Hive 分区表学习笔记:语法、操作、二级分区与动态分区
hive·笔记·学习
省钱兄--zs10 小时前
24小时自助健身房系统软件开发实战:从架构设计到部署全指南
java·数据仓库·spring boot·系统架构·需求分析
计算机毕业编程指导师10 小时前
大数据毕设选题推荐:基于Hadoop+Spark全球碳排放减排策略分析与可视化系统源码 毕业设计 选题推荐 毕设选题 数据分析 机器学习
大数据·hadoop·python·计算机·spark·毕业设计·碳排放减排
53488736abcdefg1 天前
Hive 入门&架构原理
hive·hadoop·架构
泡干脆面就番茄1 天前
Hadoop基础入门到实战:从Python理解MapReduce到HDFS架构与集群搭建
hadoop
磁场转动100万匹1 天前
Hive 学习第一天:搞懂它是什么,并搭好可用的环境
hive·hadoop·学习