大量數(shù)據(jù)去重方案

數(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":[]}

后面可直接對該值另外處理提升效率。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容