日期:2014-05-16  浏览次数:21166 次

大数据量比对方法
公司员工数据比对,程序实现
情景:
  有一个员工数据的视图,里面有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. 分批查询与比对可以参照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!!!!!!!!
------解决方案--------------------
探讨
引用:

因为是需要调用webservice接口逐条查询,感觉不需要放入不同的临时表,只需要在取的时候分批就ok了
引用:

用临时表,

首先过滤重复的身份证号,然后按照数据量大小,存入不同的临时表,然后进行比对即可
数据库取的时候怎么分批?因为没有类似自增的字段,所以下一次读取的时候不知道上一次处理到了哪一条……

------解决方案--------------------
探讨
rownum是针对oracle,这个是ms sqlserver数据库,还有表中没有类似自增的字段,这个如何做到记录上次读到了哪一行?

------解决方案--------------------
sql也有row_number()函数。
------解决方案--------------------
可以采用折半查找算法,先取中间的记录分为两半,然后每次再从中间的记录分为两半查找,直到比对到结果为止。

也可以每次比对1000条,然后记录此次比对的id号,下次比对就从这个id号开始,如此一直比对到正确为止。
------解决方案--------------------
探讨
公司员工数据比对,程序实现
情景:
有一个员工数据的视图,里面有800多万条数据,视图中有姓名,身份证号,性别等信息,其中身份证可能有重复。
有一个webservice接口,是公安数据,通过传入视图中身份证字段进行查询,每次传入一个身份号,如果有记录,则并返回姓名,身份证,出生年月等字段。
问题:
需要先查询员工视图,获得身份号码,才能调用webservice接口……

------解决方案--------------------
有个方法,先本地处理数据,对人口数据的身份证号去重,至于重号的,单独处理,
剩下的不重号的,将这些人的身份证号分段,走webservice,多开几个线程请求,这要看对方的请求处理的能力了,
你前面说了,请求是每次只能发一个身份证号