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
相关推荐
还是大剑师兰特14 小时前
Hadoop入门基础教程(110 问题+ 答案)
hadoop·大剑师·hadoop教程·hadoop入门
笨蛋少年派14 小时前
Sqoop数据迁移简介
hive·hadoop·sqoop
zhangkaixuan45614 小时前
Flink Checkpoint 全生命周期深度解析
大数据·hadoop·flink·apache·paimon
我的offer在哪里15 小时前
Hadoop 全维度技术深度解析
hadoop
沧海寄馀生15 小时前
Apache Hadoop生态组件部署分享-Impala
大数据·hadoop·分布式·apache
云闲不收15 小时前
clickhouse hbase Hive 区别
hive·clickhouse·hbase
IIIIIILLLLLLLLLLLLL1 天前
Hadoop集群时间同步方法
大数据·hadoop·分布式
RestCloud1 天前
神州通用数据库的 ETL 集成方案:兼容性与性能实战
数据库·数据仓库·etl·数据处理·数据集成·数据传输·神州通用
Macbethad1 天前
WPF工业设备诊断管理程序技术方案
大数据·hadoop·分布式
稚辉君.MCA_P8_Java2 天前
Gemini永久会员 Hadoop分布式计算框架MapReduce
大数据·hadoop·分布式·架构·mapreduce