流动人口白名单
流动人口白名单需求是我写的第一个发布使用mapreduce算子,也是第一个在阿里云上开发的需求,这里简单讲下这个需求的实现和运用到的技术。
日期 |
版本 |
修订 |
审批 |
修订说明 |
2017.07.03 |
2.0 |
章鑫 |
|
需求变更 |
|
|
|
|
|
词汇解释:
ldrk |
流动人口表 |
qlzdry |
重点人员表 |
xm |
姓名 |
xb |
性别 |
sfzh |
身份证号 |
csrq |
出生日期 |
djrq |
登记日期 |
dqrq |
到期日期 |
hkxz |
户口详址 |
zzdz |
暂住地址 |
zzzh |
暂住证号 |
pcs |
pcs |
jwh |
居委会 |
lxbzsj |
连续办证时间 |
fq_rksj |
分区_入库时间 |
zdryxl |
重点人员细类 |
1 简介
本文档主要内容是在阿里云平台的odps上通过阿里云版本的MapReduce机制来实现流口白名单业务。
2 需求分析
该需求涉及两张表,psis_ldrk、psis_qlzdry,需求的主要内容是在流动人口表中筛选出符合条件的人员并与重点人员表做碰撞,得出具体的暂住证信息和犯罪信息。求出每个身份证从最近一次办暂住证开始的连续办证区间、暂住地址最近变更时间等。
(1)详细需求内容
最后的到期时间,当页面点击查找后,输出的是从当日起,往后计算1个星期的时间。
图片 |
|
姓名 |
|
性别 |
|
年龄 |
|
身份证号 |
|
前科 |
|
户籍地 |
|
暂住地址 |
需要补全jwh字段 |
现居地派出所 |
|
连续办证时间 |
需要核对数据,只对在同一个地方连续办证两年的人才认定为白名单人员 |
联系电话 |
表里没有,字段先保留 |
登记时间 |
|
到期时间 |
根据到期时间顺序排序,如今天是6月19号,显示的日期最好是之后的一个星期,如6月26号 |
表1最终结果表
(2)筛选优先级
1、连续登记时间,(空余时间默认1个月)
2、在有连续登记记录的基础上对pcs进行筛选,需要连续2年登记在同一个pcs
3、暂住地址,因为需求方要求是对连续2年以上在同一个地址办理暂住证的人员才能认同为白名单,但实际上无法对地址进行比对,所以在现住地址列中把符合条件的所有地址全部加上,让用户自己判断
总结,连续2年以上登记暂住证且是同一个pcs,就把地址都展示出来,让用户处理,输入的查找项是否可设置成到期时间(3天后到期、一个礼拜后到期等)。
(3)MR需求解析
Ø 注意表1中置灰的内容,在MR中不涉及,由后期的SQL操作来完成
Ø 暂住地址需要加上jwh信息,暂时的格式为“jwh”+“:”+“zzdz”
Ø 到期时间不做要求,当前时间下未过期的记录全部列出,由后续操作来筛选
Ø 连续办证时间限制为连续在同一pcs办证2年以上
2.1 流动人口表
(1) 表结构
+------------------------------------------------------------------------------------+ | Owner: ALIYUN$dtdep-29-2537448c-e348-4d0a-9be9-3fd147fd2ea8 | Project: rkfwglzd_odps_stsjck | | TableComment: 暂住人口 | +------------------------------------------------------------------------------------+ | CreateTime: 2017-04-26 17:29:27 | | LastDDLTime: 2017-04-26 17:29:27 | | LastModifiedTime: 2017-05-26 16:10:18 | | Lifecycle: 100000 | +------------------------------------------------------------------------------------+ | InternalTable: YES | Size: 41646323424 | +------------------------------------------------------------------------------------+ | Native Columns: | +------------------------------------------------------------------------------------+ | Field | Type | Label | Comment | +------------------------------------------------------------------------------------+ | zzzh | string | | 暂住证号 | | xm | string | | 姓名 | | sfzh | string | | 身份证号 | 。。。 |
(2) 计算列名
业务算法涉及到的列有:
xm-姓名
xb-性别
csrq-出生日期
sfzh-身份证号
hkxz-户口详址
djrq-登记日期
dqrq-到期日期
pcs-pcs
zzdz-暂住地址
jwh-居委会
2.2 重点人员
(1) 表结构
+------------------------------------------------------------------------------------+ | Owner: ALIYUN$dtdep-29-2537448c-e348-4d0a-9be9-3fd147fd2ea8 | Project: qbzx_odps_stsjck | | TableComment: 重点人员 | +------------------------------------------------------------------------------------+ | CreateTime: 2017-05-08 15:53:07 | | LastDDLTime: 2017-05-08 15:53:07 | | LastModifiedTime: 2017-05-26 16:51:36 | | Lifecycle: 100000 | +------------------------------------------------------------------------------------+ | InternalTable: YES | Size: 907101680 | +------------------------------------------------------------------------------------+ | Native Columns: | +------------------------------------------------------------------------------------+ | Field | Type | Label | Comment | +------------------------------------------------------------------------------------+ | zj | string | | 主键 | 。。。 |
(2) 计算涉及列名
sfzh-身份证号
zdryxl-重点人员细类
2.3 算法逻辑
当前的版本整个需求分为两部分实现:
Ø 借助阿里云的MapReduce在psis_ldrk表中计算得出临时结果表
Ø SQL对psis_ldrk和psis_qlzdry进行join操作得到最终结果
第二部分涉及的主要是SQL操作,这里不作重点分析,主要分析第一部分。算法流程图如图2所示。算法分析图如图1所示。
图1
图1主要展示的是如何求出lxbzsj--连续办证时间,计算的思路是由当前时间开始,从后往前推,在前后暂住时间区间能够衔接的基础上加上同一派出所这个条件。这里需要额外考虑到一个到期的延期时间,暂时设置为30天,可配置。
业务的整个计算流程如图2所示:
Ø 从psis_ldrk表中取数据(12列)
Ø 过滤掉掉非目标区域的记录
Ø 按sfzh将所有记录整合
Ø 按djsj降序排序后过滤掉当前时间***意:这里无需加上延期时间)已经过期的sfzh的所有记录
Ø 按照前后暂住时间区间和pcs计算出符合条件的连续办证区间并得到lxbzsj
Ø 将结果存入临时表
结果表中保存的djrq和dqrq对应于最近的一次办证记录。结果表以sfzh为主键,每个身份证号一条记录写入临时表,便于后续与psis_qlzdry的SQL操作。
图2
3 数据清洗
由于数据源的原因,业务涉及的两张表中有较多的脏数据和异常数据,对于数据的清洗过滤和过滤工作是该业务的主要工作量之一。
这里给出一条数据样例:
3.1 异常过滤
目前涉及到的主要是ldrk表中的csrq、sfzh、djrq、dqrq这几列,格式都为String。
几种较为常见的异常:
Ø 数据为空
在代码里表示为””
Ø 数据为\N
在代码里表示为null
Ø dqrq为”无效的日”
这三种异常暂时采取的办法是直接过滤,不做任何转换操作。
3.2 格式转换
由于源表中的主要数据格式几乎都为String,在使用过程中涉及到时间的计算和表示就需要对时间和日期字符串进行解析和转换。
由于在阿里云上做string到date格式的转换对性能要求较大,所以结果表中时间相关列一律采用string格式保存。
临时结果表的列名和格式如表1所示。
列名 |
类型 |
例子 |
xm |
string |
张三 |
xb |
string |
1 |
csrq |
string |
19940909 |
sfzh |
string |
123456789012345678 |
hkxz |
string |
汉东省京州市 |
djrq |
string |
20170601 |
dqrq |
string |
20180531 |
pcs |
string |
123456 |
zzdz |
string |
123456123:汉东省吕州市黄河路108号, 123456124:汉东省吕州市长江路20号, 123456126:汉东省吕州市钱江路36号 |
lxbzsj |
string |
2.74(year) |
表2 结果表格式
目前所涉及的源表中的csrq、djrq、dqrq格式均为yyyyMMdd,例如20170621,只给出到天的时间,没有具体的时分秒。另外源表中的fq_rksj格式为yyyy/MM/dd,不过结果表中暂时未涉及该列。新的zzdz由jwh和zzdz合并表示,采用的格式是jwh+”:”+zzdz,且将符合条件的所有zzdz都列出,以逗号隔开。
4 附录
后续工作:
Ø jwh编号翻译
Ø MR多表作为输入数据源如何实现