記一次sparksql讀取oracle資料優化過程

2021-09-22 19:29:19 字數 1044 閱讀 9148

sparksql提供外接關係型資料庫的介面如下,
def jdbc(

url: string,

table: string,

columnname: string,

lowerbound: long,

upperbound: long,

numpartitions: int,

connectionproperties: properties): dataframe

從上述介面可知,columnname列必須是整形型別,在現實使用場景中,並不一定總是存在整形列,且表中的整形列值如果不是分布均勻的話,很容易就會出現資料傾斜現象。

如果不使用上述介面,而是使用如下

def jdbc(url: string, table: string, properties: properties): dataframe
便存在效能問題,即僅有乙個task去讀取oracle中的資料

oracle存在兩個偽列:rownum、rowid。偽劣,即表中不存在的列。rownum是邏輯存在的、整形列,且是自增的。rowid是物理存在的,其值是一串隨機數,表徵該記錄的位置。

rownum在select語句中,會對查詢結果集進行編號,利用這個特點,我們可以利用sparksql jdbc介面去實現分布式多工去讀取oracle資料,具體思路如下:

select max(rownum) ,min(rownum) from表名1,查詢最大序列號、最小序列號。

預定義乙個task處理多少條記錄,然後對上述的max、min區間進行等值劃分,得出並行度,即上述介面中的numpartitions變數值。

dataframe = sqlcontext.read.jdbc(url, select表名1.*, rownum from表名1, rownum, minvalue, maxvalue, numpartitions, prop)

丟棄「邏輯列」drop(rownum)

記一次讀取資料的經歷

乙個研究生同學因為學習需要,想提取乙個 的資料,然後把這些資料都放入excel當中。剛開始我很不在意,以前什麼樣的爬蟲沒見過,這次不過是要把資料放入excel中而已。於是我在網上找到乙個結合php生成excel的工具 phpexcel 然後寫了乙個簡單的程式,結果!失敗了 1.需要讀取的資料太多,一...

記一次除錯

這是我最近幾個月來遇到的最棘手的乙個問題 昨天花了4個小時找出第一層次的原因 這個糾結啊,本來和老婆說好準時下班回家吃飯的,結果被這個問題拖了老久。這是乙個gradle的plugin,用來resolve公司內部的dependency的,弄完了跑測試專案的,拋乙個npe,而且npe還不在自己的 裡面。...

記一次 EqualsAndHashCode的疑惑

lombok的使用真的是讓開發人員欲罷不能,乙個 data不管有多少屬性全部搞定,以後加字段也不用從新生成get和set方法。不過這裡還是有乙個小坑需要注意一下,舉個例子 public class equalsandhashcodetest data noargsconstructor access...