大数据量比对方法
公司员工数据比对,程序实现
情景:
有一个员工数据的视图,里面有800多万条数据,视图中有姓名,身份证号,性别等信息,其中身份证可能有重复。
有一个webservice接口,是公安数据,通过传入视图中身份证字段进行查询,每次传入一个身份号,如果有记录,则并返回姓名,身份证,出生年月等字段。
问题:
需要先查询员工视图,获得身份号码,才能调用webservice接口进行比对,由于员工视图数据量过大,没有自增ID,如果
一下子查询全部放到内存中肯定不信,怎样比对才能做到高效?如何做到分批查询和比对?
------解决方案--------------------1. 高效是做不到了,逐条比对是接口的要求,除非你有能力改接口,不然是没办法做到高效了。
2. 分批查询与比对可以参照SQL分页方式进行比对,比如说你每个批次取100条数据:
select * from (SELECT 身份证,rownum rn FROM TABLE) where rn > :(i - 1) * 100 and rn <= :i * 100
其中i是你的批次号,可以做个循环来分批进行,防止断线等异常还可以做个记录当前批次和恢复的处理。
------解决方案--------------------
------解决方案--------------------用临时表,
首先过滤重复的身份证号,然后按照数据量大小,存入不同的临时表,然后进行比对即可
------解决方案--------------------1.将除重后的身份证号放入临时表 -- 使用数据库操作,效率比较高
2.在应用中分批(就用一般的分页方法就ok了)读取临时表数据,到公安系统中查询。
3.根据返回结果再进行下一步操作,比如更新源表数据。根据需要在身份证号字段上建立索引。
------解决方案--------------------因为是需要调用webservice接口逐条查询,感觉不需要放入不同的临时表,只需要在取的时候分批就ok了
------解决方案--------------------ding!!!!!!!!
------解决方案--------------------
------解决方案--------------------
------解决方案--------------------sql也有row_number()函数。
------解决方案--------------------可以采用折半查找算法,先取中间的记录分为两半,然后每次再从中间的记录分为两半查找,直到比对到结果为止。
也可以每次比对1000条,然后记录此次比对的id号,下次比对就从这个id号开始,如此一直比对到正确为止。
------解决方案--------------------
------解决方案--------------------有个方法,先本地处理数据,对人口数据的身份证号去重,至于重号的,单独处理,
剩下的不重号的,将这些人的身份证号分段,走webservice,多开几个线程请求,这要看对方的请求处理的能力了,
你前面说了,请求是每次只能发一个身份证号