百万级数据量比对工作的一些整理
最近的一項工作內容是比對數據,在這里把主要的一些思考過程和思路整理一下。
工作的目標是比對源數據和目標數據,逐字段逐條記錄比較,找出不同的字段以及缺少的記錄。由于數據量比較龐大,大約有七百多萬條,源數據和目標數據分別是以文本方式來存儲,因為數據量大,所以源數據和目標數據都會被拆分成多個文件,比如源數據會拆分成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分鐘,便能找出所有只要有字段不同的記錄,這個確實讓筆者出乎意料了。
當然整個過程還有一些細節在這里就不多說了,主要的一些體會是,如果數據量龐大,加上索引效率會好很多,并且查詢條件要帶有主鍵,如此一來,便能輕松駕馭百萬級數據。
總結
以上是生活随笔為你收集整理的百万级数据量比对工作的一些整理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python——BeautifulSou
- 下一篇: 思科3750交换机堆叠配置指南