我正在基于SparkSQL開發如下需求:
1、假設有兩張表,表結構是一樣的,但業務含義不一樣。A表保存的是某電商某業務某天的計費明細,是我司大資料平臺從A系統抽取過來的。B表保存的也是計費明細,是從財務結算系統抽取過來的。
2、使用SparkSQL相關API,將A和B按某個維度進行比對,找出差異。當然了,沒有差異是最好的了。
3、對于小資料量,例如A、B表里只有幾十條計費明細,我已經開發、測驗完畢了。基本思路是:將A、B表里的資料轉換為DataFrame,使用intersect()、join()、filter()等API找出差異。
我的疑問是:
1、如果資料量非常大,如有幾千萬條計費明細,當從資料庫表A或B中加載時,是在一個Worker里完成的,還是在多個Worker里完成的?我在代碼中沒有顯式設定磁區,我也不知道如何設定:),所以非常沒底。
val options = 略
val dataFrame = sparkSession.read.format("jdbc").options(options).load()
2、當操作intersect()、join()時,要注意哪些和性能有關的關鍵代碼?
uj5u.com熱心網友回復:
從來不建議從jdbc直接抽取資料到spark(除非是做采集到數倉或者是維度表)。先做一下數倉建設,定時把資料抽到Hive里,再根據業務欄位進行磁區治理,例如根據發生時間(日期)、常用的join key等欄位進行磁區。資料提前根據資料邏輯分好區,就是性能優化最重要的一點。另外hive表磁區和資料庫組合索引一樣,遵循最左匹配原則。
uj5u.com熱心網友回復:
謝謝你的指點。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/12463.html
標籤:Spark
