[大數據][Hive]關於使用hive left join關聯出重復數據的問題解決方法記錄


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

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM