最近公司在做一個大數據項目的時候,數據量達到了1000w+的程度,並且還有源源不斷的數據從采集上來,並需要和數據庫中的數據做一系列的邏輯比對,在此就自己的實踐總結下心得,歡迎批評指正。
需求:將MySQL表中的部分數據(狀態為1)的數據和采集上來的新數據(狀態為2)的數據根據已經設置好的唯一字段(比對規則)作對比,不重復的數據修改狀態,重復數據挪到重復庫中待使用,差異數據(唯一字段重復,其余字段不重復的數據)放到確認庫給用戶確認。
1、實體類
2、由於數據量很大,不能一次性讀到內存當中,分批處理
3、關鍵的一步:采用group By過濾唯一字段重復的數據(條件允許可以加上索引),將查出來的數據寫入臨時表
createTableName:創建的臨時表名稱。
tableName:查詢的表名稱。
groupStr:group字段名,逗號間隔。
這樣臨時表當中的數據就都是不重復的數據了,相對應的將我們表中數據將狀態修改為1就可以了,INNER JOIN 和 EXISTS都可以,在這里建議用 EXISTS,因為 EXISTS 對於命中率高的數據而言,效率會比INNER JOIN更高一點,此處命中率百分之百,故此采用
EXISTS 代替 INNER JOIN。(如果想了解兩者的具體原理區別,請在下方留言)
//修改狀態
4、比較差異數據和重復數據。
因為不重復數據已經被我們找出來了並且改了狀態了,剩下的即為差異數據和完全重復數據,這兩種數據有一個共同點:唯一字段(比對規則)是一樣的,所以我們完全可以再內存中利用算法進行比較
因為很多的大數據環境下,表名字是不確定的,大多數表名字是需要服務器傳遞實參,如果是有實體類的比較大家可以嘗試着重寫compare方法和重寫hashcode方法進行比較,對於沒有實體類的,則可以通過先建立臨時表,再分批讀取到內存比較的方法進行比較,內存比較可以采用多線程的方式並發執行,這樣效率應該可以提升比較多的,歡迎大家批評指正。感謝!