本文主要是介绍Hive实现查询左表有右表没有的记录,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
工作中遇到这样一个场景,业务逻辑是:如果一个主体发生了某一问题,就不再统计该主体的其他问题。
思路:首先想到的方法就是not in
方法,但是Hive并不不支持。那么使用left join
对两个表进行连接,右表主键为空的说明是右表不存在坐标存在。
方法一:left join方法
left join
返回左表所有的记录和右表on条件可以匹配到的数据,右表匹配不到的字段值为空值。并支持查询左表和右表的相关字段。
selectt1.id,t1.field_one,t1.field_two,t2.field_three,t2.field_four
from dbname.tableName1 t1
left joindbname.tableName2 t2
on t1.id = t2.id
where t2.id is null
方法二:left anti join方法
left anti join
方法返回左表有而右表没有的数据,这种方法避免在join之后使用where条件删除不符合的数据,查询速度相对快点,但是注意left anti join
不支持查询右表字段,所以只能select左表字段。
selectt1.id,t1.field_one,t1.field_two,
from dbname.tableName1 t1
left anti joindbname.tableName2 t2
on t1.id = t2.id
返回左表和右表同时存在的记录
考虑到可能会有另一种场景:要求查询左表和右表同时存在的记录,可以进行一下变换套用。
方法一:left join
selectt1.id,t1.field_one,t1.field_two,t2.field_three,t2.field_four
from dbname.tableName1 t1
left joindbname.tableName2 t2
on t1.id = t2.id
where t2.id is not null
方法二:left semi join
left semi join
方法返回左表和右表同时存在的数据,但是不支持查询右表字段,另外如果左表有id重复的记录可能会返回第一条记录(返回记录数会和左表记录数不一致),有时不满足业务需求
selectt1.id,t1.field_one,t1.field_two,
from dbname.tableName1 t1
left semi joindbname.tableName2 t2
on t1.id = t2.id
这篇关于Hive实现查询左表有右表没有的记录的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!