15亿数据重复性校验程序

浏览: 2299

有表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(主键)0

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

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

 

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

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

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

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

推荐 1
本文由 风在身后 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

1 个评论

Good
私人收藏了 :)

要回复文章请先登录注册