Hive(10):由筛选两张表相同/不同的数据引出的exists/not exists

您所在的位置:网站首页 筛选出两张表格中重复字段 Hive(10):由筛选两张表相同/不同的数据引出的exists/not exists

Hive(10):由筛选两张表相同/不同的数据引出的exists/not exists

2024-06-05 13:26| 来源: 网络整理| 查看: 265

之前在项目中遇到需要从表a中删除和表b中id相同的样本的情况,采用了where not exists语句,可以筛选出两张表中id不同的数据

select * from table_A a where not exists (select 1 from table_B b where a.id = b.id);

参考了其他人的博文,发现可以使用left join语句改写:

select * from table_A a left join table_B b on a.id = b.id where a.id is null

这里还需要涉及到in/not in的用法,目前hive不支持 in或not in中包含查询子句的语法,所以只能通过left join实现。 在这里插入图片描述

注意,hive中的left join实际上是left outer join,会显示左表的所有字段,右表字段没有的会标null,详见Hive(三):join操作,而left semi join只允许select结果出现左表的内容 同时我们将join(即inner join)和left semi join作比对: 在这里插入图片描述 可以看到对待右表中重复key的处理方式差异:

因为 left semi join 是 in(keySet) 的关系,遇到右表重复记录,左表会跳过,而 join 则会一直遍历。这就导致右表有重复值得情况下 left semi join 只产生一条,join 会产生多条,也会导致 left semi join 的性能更高。 left semi join 中最后 select 的结果只许出现左表,因为右表只有 join key 参与关联计算了,而 join on 默认是整个关系模型都参与计算了

参考链接 Mysql筛选出两张表中不同的数据的SQL Hive之——怎样写exist/in以及not exists/not in子句 Hive 实现 IN 和 NOT IN 子句 Hive 中的 LEFT SEMI JOIN 与 JOIN ON



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3