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