15亿数据重复性校验程序

2 篇文章 0 订阅

有表A 字段信息如下:(id1,id2 ,col1,col2,col3,....colN)id1,id2 为联合主键 。每日数据量在15亿条左右,数据文件大概有350GB,每120MB一个文件。
要求在数据入库前做主键校验,保证装载到DW中的数据主键唯一。(注:DW中没有建立主键约束,即使主键不唯一也能装载成功,要求通过装载前的校验来保证主键唯一)

 


对于这个问题,我最初的想法是并行校验,假设有10个文件,开启10个线程分别对每个文件进行校验,如果足够幸运,10个文件中任意一个文件中存在重复值,我们的目的就达到了。
不过很明显,通常情况下我们并没有这么幸运,如果每个文件中都没有重复值,我们还得继续用文件1和文件2比较看有没有重复值以此类推。。。。。。。


有没有办法让我对单个文件校验发现没有重复值就可以肯定的说这10个文件没有重复值呢?


经过搜索我找到了一个可行的办法,原理就是将这个10个文件重新散列一下生成10个新文件,文件与文件之间两两不重复(参考oracle hash分区,主键想象为分区健)

那么怎么实现呢?

 

很简单,读取1行记录,将主键的两个字段拼接起来通过MD5算出其hash值并对N(你想要生成的文件数)取模,然后分别输出的N个文件中即可。

md5(主键)%100

例如:余1 则输出hash值 到1.txt
        2 则输出hash值 到2.txt
        3 则输出hash值 到3.txt
        4 则输出hash值 到4.txt

并且每个文件两两之间绝对不会存在重复记录。

 

接下来该怎么办就很容易了吧?

就可以启动10个线程同时对10个文件进行校验了,如果有一个文件发生重复则退出,如果每个文件经过检验在其内部都没有重复值,则这一批文件都没有重复值。

下面说说对一个文件进行校验的逻辑:

1、对文件进行排序
2、顺序扫描文件,如果存在下一行等于上一行则表明该文件有重复值,否则则没有。

 

 


 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值