如何在Hive中获取两张数据表的不匹配记录?
在Hive中获取两张表的不匹配记录
没问题,要找出dept_text里存在但dept里没有的记录,在Hive里有两种常用的实现方式,我给你详细说说:
方案一:左连接(LEFT JOIN)+ 空值过滤
这种方法兼容性最好,不管你用哪个版本的Hive都能跑通:
SELECT dt.* FROM dept_text dt LEFT JOIN dept d ON dt.deptno = d.deptno AND dt.dname = d.dname AND dt.loc = d.loc WHERE d.deptno IS NULL;
原理很简单:左连接会保留dept_text的所有记录,当某条记录在dept里找不到完全匹配的行时,dept对应的字段都会变成NULL。我们只要过滤出这些dept字段为NULL的行,就能得到dept_text独有的不匹配记录。
方案二:使用EXCEPT关键字(Hive 2.2.0及以上版本支持)
如果你的Hive版本比较新(2.2.0及以后),可以用更简洁的EXCEPT语法,它直接取两个结果集的差集:
SELECT * FROM dept_text EXCEPT SELECT * FROM dept;
注意:使用这个方法时,两张表的字段顺序、数据类型必须完全一致,否则会执行失败。
不管用哪种方法,针对你提供的测试数据,都会输出你期望的结果:
50 Software Bangalore
60 Housewife yellandu
内容的提问来源于stack exchange,提问作者Rocky
相关产品推荐
相关产品推荐

