关于使用hive left join关联出重复数据的问题解决方法记录
问题描述
两张表A表和B表
A表数据结构
ID、名称、其他字段
B表数据结构
ID、名称、其他字段
需求
需要将B表中ID在A表中存在的数据拿出来分析最终将结果吐出到新表中
我这边分析是用spark分析的。提数据需要用hive sql提。这里我一开始使用的语句是
select b.* from A a left join B b on a.id=b.id and b.id is not null
因为我这边只需要对B表的数据进行分析所以只取了b.*
现象
发现最终结果出现非常多的重复数据,而且有的重复有的不重复
原因数据判别
A表中有4条同一ID的重复数据
B表中有4条同一ID的重复数据
结果表中该ID的数据出现了16条
期望结果:
目标表中应该只有B表中的四条数据结果
原因:
在做left join 的时候并不是一对一的。而是一对多。当left join 发生时。每一个ID的每条数据都会join目标表中的所有跟这个ID能关联上的数据。而我这里有4条ID相同的重复数据。也就进行了4次 对B表的该ID的4次JOIN。每一次JOIN都JOIN到4条。所以最终结果便是4*4=16条
解决方法。让关联的A表不对重复ID关联即最终取数据的SQL如下:
select b.* from (select a.id from A a group by a.id) c left join b on c.id=b.id and b.id is not null
这样取出来的数据就以B表数据为准了。同理如果想保留A表数据那就是对B的ID去重。