开发者学堂课程【大数据实战项目:反爬虫系统(Lua+Spark+Redis+Hadoop 框架搭建)第三阶段):数据预处理-数据解析-总结及预定数据分析】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/671/detail/11663
数据预处理-数据解析-总结及预定数据分析
内容介绍:
一、课前小结
二、预定类数据解析介绍
一、课前小结
上节课学习了查询型的解析。所以进行总结。
第一个,读取数据库的规则。代码如下:
var queryRule = AnalyzeRuleDB.queryRule(behaviorType = 0)
然后就是加载到广播变量。下面是解析规则的代码:
@volatile var broadcastQueryRules=sc.brocast(queryRule)
加载到广播变量以后就是去判断它是否需要更新,判断是否需要更新的代码很长,所以这里不做展示。
接下来就是进行解析,下面是解析的代码,也就是解析的规则:
val queryRequestData =
AnalyzeRequest.analyzeQueryRequest( requestType,
requestMethod,contentType,requestUrl,requestBody,travelType, broadcastQueryRules.value)
至于数据解析的代码,因为有很多。这样就实现查询型的数据解析工作。
二、预定类数据解析介绍
其实预定的解析思路跟查询型的解析思路一模一样,只不过读取预定的数据到程序里面来的时候,behaviortype 的参数为1,1代表预定
var bookRule=AnalyzeRuleDB.queryRule(behaviorType = 1)
如果这个参数是1,看下面这行代码:
val sql: String = "select * from analyzerule where
behavior_type =" + behaviorType
那么变量就是1,所以在数据库当中要把 behavior_type 是1的查出来,看下图发现,这里有三个数据:
把它们查出来,这些就是预定类的数据。然后要对这三条数据的每一个字段,查出来再进行封装,封装完后返回到如下代码所示位置。
//读取数据库内的数据解析规则到预处理程序(将表内的所有查询规则数据全部读取到程序内)
//数据解析规则--查询类
var queryRule=AnalyzeRulgDB.queryRule(0)
@volatile var broadcastQueryRules=sc.broadcast(queryRule)
//数据解析规则--预定类
var bookRule=AnalyzeRuleDB.queryRule(1)
@volatile var
broadcastBookRules=sc.broadcast(bookRule)
然后添加到广播变量:
@volatile var broadcastBookRules=sc.broadcast(bookRule)
添加到广播变量后依然需要更新,这里面是也是用 NeedUpDataAnalyzeRule ,代码跟查询类一模一样,不过预定类用的是 book ,behaviortype是1,在这里面预定的数据也要进行重新读取,然后重新清空广播变量,重新载入过滤数据。
代码://环判断是否需要更新
val
needupDataAnalyzeRule=redis.get("NeedupDataAnalyzeRule")
//如果获取的数据是非空的,并且这个值是 true, 那么就进行数据的更新操作
if( !needupDataAnalyzeRule.isEmpty&&
needupDataAnalyzeRule.toBoolean){
//重新读取 mysql 的数据
queryRule=AnalyzeRuleDe.queryRule( behaviorType =0)
bookRule=AnalyzeRuleDB.queryRule( behaviorType = 1)
//清空广播变量中的数据
broadcastQueryRules.unpersist()
broadcastBookRules.unpersist()
//重新载入新的过滤数据
broadcastQueryRules=sc.broadcast(queryRule)
broadcastBookRules=sc.broadcast( bookRule)
//更新完毕后,将 Redis 中的 true 改成 false
redis.set("NeedupDataAnalyzeRule","false")
}
最后一步就是解析。实际上预定的解析和查询的解析是一模一样的,而且思路也是一样的,预定数据的实现的目标是解析出预定数据当中的出发地,目的地和起飞时间。但是在这里,由于我们拿不到数据,所以这个就暂时做不了,但是虽然这个解析没有数据,最差的就是解析都是空,但是还是要解析一下,因为后面的计算也许会用到,不管是预定类的数据还是查询类的,都有可能。
所以把这个也解析一下,解析思路包括处理流程都是一样的,解析规则的代码直接写在下面:
val bookRequestData =
AnalyzeBookRequest.analyzeBookRequest(requestType,requestMethod, contentType, requestUrl, requestBody,
travelType,broadcastBookRules.value)
那这个就是去解析预定类数据的过程,之前查询类解析的时候有一个 analyzeRequest,而预定类解析里面有一个
analyzebookRequest ,它们的参数都是一样的。这两个的位置都在提供的 business process 里面。
预定类的里面实际上思路和查询类的思路是一模一样的。它的数据解析代码也是已经写好了的,大约在100行左右。下面就是解析预定数据的部分代码:
这里面需要的参数,在下面的代码里就能找到:
val bookRequestData =
AnalyzeBookRequest.analyzeBookRequest(requestType,requestMethod, contentType, requestUrl, requestBody,
travelType,broadcastBookRules.value)
所以把参数都传递进来,进来以后进行解析,解析完成也能解析出:出发地和目的地,因为没有数据,所以看不到效果,但这个过程必须要有。这个就是预定类的解析过程的过程。因为首先没有数据,看不到效果,第二,读取规则,加载到广播变量,判断是否需要更新,前面已经进行了学习,所以这里快速通过。以上就是预定类的数据解析。