开发者学堂课程【大数据实战项目:反爬虫系统(Lua+Spark+Redis+Hadoop 框架搭建)第三阶段):数据预处理-航线类型操作类型-逻辑判断实现】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/671/detail/11656
数据预处理-航线类型操作类型-逻辑判断实现
内容介绍:
一、概述
二、打标签的具体思路
一、概述
更新规则已经学习,接下来开始实现真正的打标签动作,现在数据、url 以及四个业务场景的规则都存在了,接下来就开始实现打标签动作,确定思路。
二、打标签的具体思路
1.定义方法,参数为经过拆分后的 URL 和分类的广播变量
首先要定义一个方法,然后把 url 和分类的广播变量传进去,方法的具体名称可以从讲义中拷贝过来:RequestTypeClassifier.classifyByRequest,程序中目前还没有这个方法,因此会显示报错,需要在数据预处理的businessprocess 里右键新建一个叫 packageobject,Name 即为 RequestTypeClassifier,用于实现数据分类的代码编写,此时返回可以看到程序中该方法就不会报错了。classifyByRequest 这个方法还没有,会显示报错,稍后进行该方法的创建。首先将 url 传入,如何判断数据到底是哪个业务场景,可以用 url 去匹配四个业务规则,url 拿到后再把前面广播变量里面的数据拿到,在广播变量后(broadcastRuleMaps)输入.value,.value 才是真正的数据,数据url 和规则都有了后,接下来进行方法代码的编写。
2.进入 classifyByRequest 里面创建方法,主用来实现航线航线和操作类型的标签
将?删掉并补全{}的内容,requesturl 已经存在了,规则 value 修改为 RuleMaps,把规则拿出来对应随堂笔记当中:先在分类的广播变量中获取四种业务场景的规则,获取出来以后遍历四个规则去进行匹配,匹配完以后再最终返回类型这一部分的流程。
第一步:把数据的规则都读取出来,规则分为四种,分别是:国内查询的规则、国际查询的规则、国内预定的规则、国际预定的规则,四个规则分别进行接收,分别创建变量,国内查询为:val nqRuleList=RuleMaps.get("key"),key的名字叫做 nqRuleList,因为 nqRuleList 作为 key 写进的,也应该以该名称读出来,代码为:val nqRuleList=RuleMaps.get("nqRuleList");
同理,
国际查询的名字为 iqRuleList(international query),代码为:val iqRuleList=RuleMaps.get("iqRuleList");
国内预定的名称为 nbRuleList(national book),代码为:val nbRuleList=RuleMaps.get("nbRuleList");
国际预定为 ibRuleList(international book),代码为:val ibRuleList=RuleMaps.get("ibRuleList")
。
第二步:在 Map 里边把四种业务查询的规则读取完成之后,接下来做第二件事情,遍历四种情况的规则与数据进行匹配,分别完成遍历国内查询规则、国际查询规则、国内预定规则、国际预定规则。先拿到规则,这里规则已经存在了,输入:for(nqRule<-nqRuleList){}后去做判断。如果数据match到其中一个规则(代码为:if (requesturi.matches(nqRule)))。
- 遍历国内查询规则
任何一个数据匹配到国内查询,就表明该数据是国内查询业务,该 url 就是国内查询。说明:使用数据匹配国内查询的规则,若匹配成功,表示该 URL 所在的数据就是国内查询。即 url 确定后,用 URL 匹配到里面的任何一个规则,就可以确定 url 的业务场景,确定以后就可以去实现具体的返回类型。bin 里面的 processdata 有专门的标记用来表示是国内查询还是国际查询,双击并打开最后的 request type,request type 分为 flight type 和 behaviour type,分别表示 flight type 和 behaviour type 的枚举,flight type 代表了国内和国际,behaviour type 代表了查询和预定。首先需要实现 flight type,复制粘贴到程序里面,粘贴时需要引入,否则会报错。数据匹配上(national query)国内查询的规则后,就表示该数据是国内查询,而国内查询具有 flight type 的枚举,可以直接调用 flight type 枚举,然后将 behaviour type 的枚举引进来,代码为:RequestType(FlightTypeEnum.National,BehaviorTypeEnum. Query)
表示数据匹配上的规则是 national query,匹配后完成了反馈。现在数据确定为国内查询,还需要在前面定义一个变量,把数据返回。
定义返回的类型,代码为:
var requestType :requestType=null
并用它进行接收,先将其设置为 null 空,然后进行匹配,匹配后的结果是国内查询就会返回给它,而它就有了数据,最终再把它进行返回即可,返回最终的数据就是 requestType。现可以断定数据的业务类型,是国内的查询。遍历国内查询的完整代码为:
for(nqRule<-nqRuleList){
if (requestur1.matches(nqRule)){
requestType=RequestType(FlightTypeEnum.NationaL,BehaviorTypeEnum.Query)
}
}
- 遍历国际查询规则
对于国际查询实现思路是一样的,这需要进行小部分改动即可,完整代码为:
for(iqRule<- iqRuleList){
if (requestur1.matches(iqRule)){
requestType=RequestType(FlightTypeEnum.InternationaL,
BehaviorTypeEnum.Query)
}
如果数据匹配国际查询的规则成功,就代表数据为 international query 业务场景。
- 遍历国内预定规则
用 url 与多个规则匹配,与国内预定匹配成功后表示该 url 为国内预定。完整代码为:
for(nbRule<-nbRuleList){
if (requestur1.matches(nbRule)){
requestType=RequestType(FlightTypeEnum.NationaL,BehaviorTypeEnum.Book)
}
}
用数据去国际预定的规则,如果匹配成功就表示数据为国际预定。完整代码为:
for(ibRule<-ibRuleList){
if (requestur1.matches(ibRule)){
requestType=RequestType(FlightTypeEnum.NationaL,BehaviorTypeEnum.Book)
}
}
3.程序的完善:增加守护进程,true 表示继续执行
至此代码已经写入完毕,但还不完善,并不健壮。因为某些数据完成第一个判断后,就可以确定是国内查询了,没有必要进行后续的判断了,因为一条数据只能属于一个业务规则,假设已经确定为国内查询,不需要进行后续的三个循环,这时需要加一个守护进程,定义一个 var 可变数据类型 flag,使其等于 true,在 for 循环里面添加判断语句,如果 flag 等于 true 就继续执行,第一次为 true,如果匹配上了,就把 flag 改成 false,每个循环都要增添一个守护进程,咨询flag是否继续执行,true表示继续执行,false表示不再执行。如果第一个匹配成功,就让后者不执行,就让flag=false,如果为 false 则后面的 for 循环就不在执行,这样就能够实现所需的效果,如果第一个没匹配成功,flag 仍是 true,如果第二个循环匹配成功,就改为 false。还有一种情况,数据不属于这四种情况,数据没有匹配上任意一个规则,flag 仍为 true,就表示它没有匹配上任何一个规则,flight type 和 behaviour type 均属于 other。至此打标签属于国际查询、国际查询、国内预定还是国际预定的代码就已经写入完毕了。