百萬級資料量比對工作的一些整理

2022-03-10 18:16:58 字數 1174 閱讀 5009

最近的一項工作內容是比對資料,在這裡把主要的一些思考過程和思路整理一下。

工作的目標是比對源資料和目標資料,逐字段逐條記錄比較,找出不同的字段以及缺少的記錄。由於資料量比較龐大,大約有七百多萬條,源資料和目標資料分別是以文字方式來儲存,因為資料量大,所以源資料和目標資料都會被拆分成多個檔案,比如源資料會拆分成4個檔案,目標資料可能會拆分成7個檔案,每個檔案可能都會有幾十兆的大小,當然源資料和目標資料都會有唯一化一條記錄的編號,類似資料庫中的主鍵,可以通過此編號來進行比對。

由於數量實在太大,之前公司內部使用的excel比對工具無法完全讀取所有記錄,無法勝任此項工作,因此尋求另一種比較有效率的方式。

最初,採用指令碼語言比如ruby來分別讀取源資料和目標資料,存成2張hash表,key是唯一化的編號,value則是所有字段值的連線,正好文字檔案中每一行是類似這樣子的:20003000,abc,efd,……字段之間會以逗號分隔,而前面的編號的長度是固定一致的,位數不夠前面都會以0填充,所以可以按照這個長度進行分隔,左邊作為key,右邊則是value,從而將所有記錄合起來形成一整張hash表來進行比對。經過一些指令碼的優化,比如兩個hash錶比對時,比完一條就刪除一條以減少遍歷次數,但仍然效率不夠理想,這邊給出乙個結果,我用了3臺機器,將近5個小時比對完700w+的資料量。雖然能完成任務,但是消耗也很大,是否有一種更快,更方便的方法呢。

答案是肯定的,採用資料庫的方式,把資料都扔到資料庫裡面,用sql來作比較,這顯然是乙個比較效率並且靈活的辦法。那開始嘗試吧。

筆者採用mysql資料庫,個人計算機安裝比較方便,而且穩定可靠。建立兩張表,用來分別儲存源資料和目標資料,然後將源資料和目標資料的文字做一些處理,匯入至excel再匯出,以某乙個字元比如tab作為分隔符,然後通過sql語句將所有文字資料匯入至兩張表。完成之後,寫sql,也很簡單,通過編號內連線兩張表,然後以各個欄位不相等作為條件進行查詢。然而事與願違,對於2張700w+的表來說,查詢仍然非常耗時,竟然要超過10個小時以上,由於sql執行超時,並沒有產生結果,於是筆者暫時卡在了這裡。

不過,有朋友提醒,加上索引可能會有改觀。經過一些嘗試,筆者重新建立了帶有主鍵索引的兩張表,並且重新分別匯入一遍資料,然後驚奇的發現,原先的查詢只用了5分鐘,便能找出所有只要有欄位不同的記錄,這個確實讓筆者出乎意料了。

當然整個過程還有一些細節在這裡就不多說了,主要的一些體會是,如果資料量龐大,加上索引效率會好很多,並且查詢條件要帶有主鍵,如此一來,便能輕鬆駕馭百萬級資料。

xstream的一些資料整理

1 xstream的作用 把pojo物件轉換成xml,把xml轉換為pojo物件。預設基於 2 xstream的常用方法介紹 初時化 xstream stream new xstream 轉換宣告 物件和xml轉換的規則宣告 1,stream.alias xml顯示 類.class 顯示物件 2,x...

整理的一些DarkStar的資料

darkstar可以提供很多特性來幫助開發人員,主要包括 提供簡單的程式設計模式來隱藏複雜的多工處理,多執行緒和伺服器複製等工作 針對mmorpg,提供伺服器的擴充套件能力,來滿足 式增長的玩家 mmorpg也不必再通過分割槽來解決玩家認輸的限制了 遊戲狀態的自動恢復能力 當出現伺服器當掉的情況 提...

大資料量的兩個表資料複製的一些經驗總結

1.如果兩個表的資料結構一樣,可以考慮很多種方式 1 create table as select from tbl name 3 引入指令碼 declare maxnum number defult 5000 cursorcuris select fromaa 定義游標 type recistab...