开发者学堂课程【大数据实战项目:反爬虫系统(Lua+Spark+Redis+Hadoop 框架搭建)第三阶段):数据预处理-航线类型操作类型-读取规则到程序】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/671/detail/11654
数据预处理-航线类型操作类型-读取规则到程序
内容介绍:
一、航线类型操作类型目标
二、航线类型操作类型实现思路
一、航线类型操作类型目标
1. 概述
前面的课程中已经将数据分类中飞行类型和操作类型的详细思路进行了学习,接下来按照思路顺序进行每一步的实现。第一步是读取数据库的分类规则到预处理程序,对四种场景分别读取,这一步之前需要读取原始数据。目前所显示的界面表示原始数据已经读取过来了,下面进行代码的写入。代码写入的第一步是读取数据库的分类规则到预处理程序,分为四种情况如然后添加到预处理程序当中,该流程也属于读取数据库的规则。前一次读取规则是在setupSSC 目录里面的初始化阶段读取,读取数据库中的过滤规则。因为读出来的数据是在 foreachRDD 里面的,每间隔两秒钟就需要执行一次代码,数据库的读取操作在 MySQL 里意味着每隔两秒钟就需要读取一次MySQL,而MySQL 加载过程比较复杂,所以要先在程序初始化的时候把规则读取过来,然后在每一次迭代的时候把它再redis里进行标记,对应流程中的是否需要更新一个标记。
二、具体流程
在程序初始化阶段,可以看到读取到的过滤规则,再把读取数据的分类规则写入,写入方法如讲义中所示:AnalyzeRuleDel. queryRuleMap(),其中 queryRuleMap()会报红,而 AnalyzeRuleDel.不会,这是因为AnalyzeRuleDel.在前面读取过滤规则时已经写入了,而queryRuleMap()还未被写入。
下面创建 queryRuleMap()的方法,右键选择 create 进行编辑,数据分类规则的读取分为四种情况。现在需要读取的最关键数据只有一个字段及附加条件,具体的四种情况如下:
分别是国内查询(00)、国际查询(01)、国内预定(10)、国际预定(11),针对这四种情况可以借用 queryData(sql,field)方法,分别写一个sql及字段进行接收即可。借用该字段需要注明前面的参数 sql,并且要有一个 field 字段进行接收。
1.sql 语句的写入
国内查询:
val nqsQL="select expression from itcast_classify_rule
where flight_type=0 and operation_type=0"
国内为 national,查询为 query,因此国内查询的简写为 nq。select 的表来自 itcast_classify_rule,国内查询的SQL,把数据读取过来,先写 SQL,再把字段读取过来,这就是调用方法。国内查询中的 flight type 代表的航班类型=0,operation type 代表的操作类型=0,即 flight_type=0 表示国内,operation_type=0表示查询。
国际查询、国内预定、国际预定只需要将上述语句进行稍微改动即可,代码分别为:
国际查询:
val niqsQL="select expression from itcast_classify_rule
where flight_type=1 and operation_type=0"
国际为 international,查询 query,缩写为 iq,flight_type=1表示国际,operation_type=0表示查询。
国内预定:
val nbsQL="select expression from itcast_classify_rule
where flight_type=0 and operation_type=1"
国内为 national,预定为 book,缩写为 nb,flight_type=0 表示国内,operation_type=1表示预定。
国际预定:
val nbsQL="select expression from itcast_classify_rule
where flight_type=1 and operation_type=1"
国际为 international,预定为 book,缩写为 ib,flight_type=1表示国际,operation_type=1表示预定。
至此查询语句已经写好,但是具有一定缺陷,语句均被写死,材料中提供了几个枚举,behaviour type 表示的是操作类型,query 和 book 分别表示的是查询和预订,flight type 表示航线类型,0代表着国内,1代表着国际。利用枚举可以进行完善,首先是 behaviour 的枚举,其中 query 表示查询,即0表示查询,刚才所写的代码中 operation type表示查询,将0删除后并添加上枚举 BehaviorTypeEnum.Query,但是所调用的并非 query 的字段,而是它所代表的0,因此还需要在 BehaviorTypeEnum.Query 后加上.id,即可拿到查询所代表的0字段。
操作类型修改完毕后是飞行类型,其枚举为:FlightTypeEnum。需要引入的 national(0)表示国内,删除源代码中的0后加入枚举 FlightTypeEnum.National.id
修改后的国内查询代码为:
val nQSQL = "select expression from itcast_classify_rule
where flight_type="FlightTypeEnum.National.id" and
operation_type= " Behavior TypeEnur ,Query.id
表示飞行类型为 national.id=0,即 flight_type=0国内,Query.id=0,即查询
其它修改方式类似,分别加上枚举和.id,修改后的代码分别是:
国际查询:
val iqSQL = "select expression from itcast_classify_rule
where flight_type="FlightTypeEnum.International.id" and
operation_type= " Behavior TypeEnur ,Query.id
国内预定:
val nbSQL = "select expression from itcast_classify_rule
where flight_type="FlightTypeEnum.National.id" and
operation_type= " Behavior TypeEnur ,Book.id
国际预定:
val ibSQL = "select expression from itcast_classify_rule
where flight_type="FlightTypeEnum.International.id" and
operation_type= " Behavior TypeEnur ,Book.id
至此 SQl 语句写完并且完善,整体步骤并不麻烦,但是需要一定的工作量
2.定义一个接收数据的字段
借用前面的字段 field,并修改为 expression,代码为:
val field="expression”
3.在数据库中读取数据
调用:val filterRuleList=QuenyDB, queryData(sql,field)
方法,读取数据依旧是分四种情况进行分别读取,field 是一样的,唯一不一样的就是 sql 语句,具体代码及解释如下:
国内查询规则读取:
val nqRuleList= QueryDe.queryData(nqsQL,field)
val nqRuleList 表示定义一个变量进行接收
国际查询规则读取:
val iqRuleList= QueryDB.queryData(iqsQL,field)
国内预定规则读取:
val nbRulelist= QueryD8.queryData(nbsQL,field)
国际预定规则读取:
val ibRuleList=QueryDB.queryData(ibsQL,field)
截至目前,四种业务场景的规则已经读取完毕了。
4.将四种业务的规则封装到一个 Map 内
数据拿取完毕后可以分次返回,但是不太友好,可以通过一定的方法将四种方法一次性返回,即需要把四个结果封装到一个 map 里面,然后把 map 返回,即可一次性拿到四个业务场景,后续在计算的时候可以再把四个业务场景迭代出来。
定义为:val RuleMaps 并实例化为 val RuleMaps=new Java util.HashMap[]()。达到监视效果还需要定义 key 和value,key 定义为 string,value 是真正的数据,规则会有多个,因此 value 的数据类型定义为ArrayBuffer,ArrayBuffer 中里为 string 类型,即定义 Map 的代码为:
val RuleMaps=new
util.HashMap[string,ArrayBuffer[String]]()
下面把四个类型的数据分别添加到Map里,具体代码为:
国内查询:
RuleMaps.put("nqRuleList",nqRuleList)
其中 key 为 nqRuleList,value 也为 nqRuleList
国际查询:
RuleMaps.put("iqRuleList",iqRuleList)
国内预定:
RuleMaps.put("nbRuleList",nbRuleList)
国际预定:
RuleMaps.put("ibRuleList","ibRuleList)
5.将 Map 返回
把语句:RuleMaps 放在最后一行即可将其返回。
至此数据预处理的读取规则设置完毕。返回后将数据类型补全,在程序的前面把数据库读取过来的同时要设置一个接收,接收仍然使用 RuleMaps,代码为:
val RuleMaps=AnalyzeRuleDB.queryRuleMHap()
表示把数据库读到程序里面,然后将规则添加到广播变量里,即调用 SC,代码为:@volatile val
broadcastRuleMaps=sc.broadcast(RuleMaps)
四种业务的规则已经读取到程序当中,同时也添加到了广播里面。