数据库中有有一张表专门存储用户的维度数据,由于随着时间的推移,用户的维度数据也可能发生变化,故每一次查看都会保存一次记录。
现在需要对数据按用户分析,但当中有大量的重复数据,仅用数据库的等值去重明显不可行。
对数据内容求MD5值
- MD5值的特点:
1.压缩性:任意长度的数据,算出的MD5值长度都是固定的。
2.容易计算:从原数据计算出MD5值很容易。
3.抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。
4.强抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。
根据MD5值的特点,对每条记录的维度数据内容计算MD5值,然后根据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
对数据入库之后利用sql直接查出重复数据,然后将重复数据移除或者标记。
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
)
在查看重复数据同时,出现几个大量重复的值,通过查看原始内容发现为:
md5值 | 实际内容 |
---|---|
4067f33047d9b56d0046d8141c783e68 | {"errorCode":"0","errorDescription":"报告不存在,请稍后再试","successful":"0"} |
372c04fa8482595762c0ec496964284c | {"result":0,"message":"查询成功","matches":[]} |
后面可直接对该值另外处理提升效率。
网友评论