數(shù)據(jù)庫中有有一張表專門存儲用戶的維度數(shù)據(jù),由于隨著時間的推移,用戶的維度數(shù)據(jù)也可能發(fā)生變化,故每一次查看都會保存一次記錄。
現(xiàn)在需要對數(shù)據(jù)按用戶分析,但當中有大量的重復數(shù)據(jù),僅用數(shù)據(jù)庫的等值去重明顯不可行。
對數(shù)據(jù)內(nèi)容求MD5值
- MD5值的特點:
1.壓縮性:任意長度的數(shù)據(jù),算出的MD5值長度都是固定的。
2.容易計算:從原數(shù)據(jù)計算出MD5值很容易。
3.抗修改性:對原數(shù)據(jù)進行任何改動,哪怕只修改1個字節(jié),所得到的MD5值都有很大區(qū)別。
4.強抗碰撞:已知原數(shù)據(jù)和其MD5值,想找到一個具有相同MD5值的數(shù)據(jù)(即偽造數(shù)據(jù))是非常困難的。
根據(jù)MD5值的特點,對每條記錄的維度數(shù)據(jù)內(nèi)容計算MD5值,然后根據(jù)MD5值判斷重復記錄。
def main(self):
for (credit_report_third_id,user_id,report_json) in self.get_records(1000):
try:
m2 = hashlib.md5()
m2.update(report_json.encode('utf-8'))
md5value = m2.hexdigest()
self.insert_to_db(credit_report_third_id,user_id,md5value)
except Exception as e:
raise
對數(shù)據(jù)入庫之后利用sql直接查出重復數(shù)據(jù),然后將重復數(shù)據(jù)移除或者標記。
SELECT
credit_report_third_id
FROM
credit_report_third_md5 as a
WHERE
EXISTS (
SELECT
1
FROM
credit_report_third_md5 as b
WHERE
a.user_id = b.user_id
AND a.md5value = b.md5value
AND a.credit_report_third_id > b.credit_report_third_id
)
在查看重復數(shù)據(jù)同時,出現(xiàn)幾個大量重復的值,通過查看原始內(nèi)容發(fā)現(xiàn)為:
| md5值 | 實際內(nèi)容 |
|---|---|
| 4067f33047d9b56d0046d8141c783e68 | {"errorCode":"0","errorDescription":"報告不存在,請稍后再試","successful":"0"} |
| 372c04fa8482595762c0ec496964284c | {"result":0,"message":"查詢成功","matches":[]} |
后面可直接對該值另外處理提升效率。