Hive中的in、exists和left semi join

简介: Hive中的in、exists和left semi join
在hive sql开发的过程中,对于当前数据在另一个数据集合中,是否存在的判断有三种方式,一种是in ,一种是exists,另一种可以是left semi join,但是由于hive不支持in|not in子查询,所以如果是单纯判断一个值是否在一个集合里面存在的时候,可以用in,但是判断一个集合在另一个集合存在的时候,还是推荐使用exists和left semi join。

一、数据准备

1,建表

CREATE TABLE test.in_test1
(
id      varchar(10)
,name   varchar(10)
,sex    varchar(10)
,age    varchar(10)
);

CREATE TABLE test.in_test2
(
id      varchar(10)
,name   varchar(10)
,class    varchar(10)
,school    varchar(10)
);

2,插入数据

INSERT INTO test.in_test1 VALUES
('1','xiaoming','1','17'),
('2','xiaohua','0','23'),
('3','jack','1','12'),
('4','rose','0','28'),
('5','jenny','0','45'),
('6','judy','0','10'),
('7','wangwu','1','35')
;
INSERT INTO test.in_test2 VALUES
('1','xiaoming','3','花花高中'),
('2','xiaohua','5','北京大学'),
('3','jack','2','新民中学'),
('4','rose','1','清华大学')
;

3,查询数据

SELECT * FROM test.in_test1;

在这里插入图片描述

SELECT * FROM test.in_test2;

在这里插入图片描述

二、join

1,查询语句

SELECT * 
FROM test.in_test1 test1 
JOIN test.in_test2 test2
ON test1.name = test2.name
;

2, 查询结果

在这里插入图片描述

三、exists

1,查询语句

SELECT * FROM test.in_test1 test1 
WHERE 1=1
AND EXISTS (SELECT * FROM test.in_test2 test2 WHERE test1.name = test2.name)
;

2, 查询结果

在这里插入图片描述

四、left semi join

left semi join 只传递表的 join key 给 map 阶段,因此left semi join 中最后 select 的结果只许出现左表;遇到右表重复记录,左表会跳过,而 join 则会一直遍历。这就导致右表有重复值得情况下 left semi join 只产生一条,在关联的时候会更加的高效。

1,查询语句

SELECT * 
FROM test.in_test1 test1 
left semi JOIN test.in_test2 test2
ON test1.name = test2.name;

2, 查询结果

在这里插入图片描述

总结

所以在判断是否存在的时候,由于Hive 不支持 where 子句中的子查询,所以最好的办法是采用exists和left semi join,这样在运行效率上面也会提高很多。

相关文章
|
5月前
|
SQL 缓存 分布式计算
54 Hive的Join操作
54 Hive的Join操作
47 0
|
7月前
|
SQL 存储 大数据
大数据Hive Join连接查询
大数据Hive Join连接查询
41 0
|
SQL HIVE
hive:条件查询、join关联查询、分组聚合、子查询
hive:条件查询、join关联查询、分组聚合、子查询
612 0
hive:条件查询、join关联查询、分组聚合、子查询
|
SQL 消息中间件 监控
​实战:Flink 1.12 维表 Join Hive 最新分区功能体验
我们生产常有将实时数据流与 Hive 维表 join 来丰富数据的需求,其中 Hive 表是分区表,业务上需要关联上 Hive 最新分区的数据。上周 Flink 1.12 发布了,刚好支撑了这种业务场景,我也将 1.12 版本部署后做了一个线上需求并上线。对比之前生产环境中实现方案,最新分区直接作为时态表提升了很多开发效率,在这里做一些小的分享。
​实战:Flink 1.12 维表 Join Hive 最新分区功能体验
|
SQL HIVE 关系型数据库
|
SQL HIVE 测试技术
Hive连接JOIN用例详解(转载)
转自: https://my.oschina.net/iamchenli/blog/845850 http://www.cnblogs.com/xing901022/p/5804836.html
796 0