關於使用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去重。