开发者学堂课程【大数据实战项目:反爬虫系统(Lua+Spark+Redis+Hadoop 框架搭建)第三阶段):数据预处理—数据清洗—数据过滤功能代码】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/671/detail/11645
数据预处理—数据清理—数据过滤功能代码
前面已经将规则读取过了,并且已经将其添加到广播变量里面,而且数据也已经获得。数据、规则都已经获得,接下来要观察数据,看流程已经进行到哪个部分,若不需要更新,则就直接过滤。若需要更新,则按更新的流程进行。
一、数据清洗过滤代码
接下来进行数据清洗。流程是先定义一个方法,然后开始做数据的清洗,这里先对方法进行命名,即命名为 URLFilter.filterURL,将其复制粘贴过来,这就是数据定义的方法,此方法用来调用,实际上就是在这里进行数据过滤,但是由于流程的最后一步,需要调用 RDD 的 filter 进行数据的过滤。如何将其过滤掉,如果选择删除,没有 delete 的操作,但这里是 rdd 中提供了数据过滤的方法。输入 rdd.filter,在 filter 存在一条条数据,如果在数据返回处就保留,false 就选择删除这样的方法。而此方法里,调用数据过滤,然后在 URLFilter.filterURL 方法里,把此方法返回处和 false 选择就可以完成。所以先把 URL 的 RDD 的filter方法补全,这里出来的是每一条数据 message,用 message 来调用这个方法,把 filterURL 方法直接放在 message 后方,通过 filter 获得每一条数据,把每一条数据传给此方法。除了此方法之外,在数据传输进去之后,应该按照什么规则来进行过滤?或者进行匹配?这里可以得知规则在广播变量里,因为前面已经将其放到广播变量里,拿到广播变量数据后,粘贴到下方,这是广播变量,这里需要拿到广播变量里的数据,需要调用.value,value 才是真正的数据,这个就是数据过滤的方法。
//2 数据清洗功能
//定义方法,参数为一条数据和广播变量
rdd.filter(message=>URLFilter.filterURL(message,broadcastFilterRuleList.value))
在数据过滤里面这个方法还没有,代码下加了一条横线,因为现在此方法没有且 filter 要求反复的 ture 和 false 也没有,所以其显示报错。现在先创建 url 的filterobject,依然到数据预处理中的业务处理里面,右键新建 Scala Object给它起个名字叫做 urlfilter。然后进行用于数据过滤(过滤无用的数据),此时先来引入,引入后urlfilter 就没有了。接下来让其来创建一下,将三个问号删掉,把大括号补全,这就是实现数据的过滤功能。
//用于数据过滤(过滤无用的数据)
object URLFilter {
//实现数据的过滤功能
def filterURL(message:String,value:ArrayBuffer[string]):Boolea={
此时它默认需要返回布尔类型,因为前面需要一个布尔类型,将方法创建出来后,这里面返回了一个布尔类型,证明该方法可行。调用 filter 方法的一条数据,将这条数据和广播变量传进去,此时去返回处和 false 即可。
接下来写代码,可知 message 数据没有问题,value 不太好,value的值是过滤规则,即 FilterRuleList 过滤规则的历史,粘贴并换个名字。该代码实现的逻辑先后顺序如何过滤,可知定义方法已经具备,接下来截取出数据当中的 url,ctrlc 在上述代码中。然后遍历数据过滤的规则,拿 url 与过滤规则进行匹配,这是第二步;第三步是若匹配成功,返回 false,若匹配不成功,即返回 ture;下一步调用返回;最后一步调用 filter,实际上在这里面已经调用了它,rdd.filter 去执行代码。
接下来写该代码,可知现在写代码处显示标红,因为它要求返回布尔类型,而现在这里面什么都没有。所以,先给出布尔类型的数据,做一个标记即 val save 保留,因为这里过滤数据,那就先给出保留的数据,将它命名成 true ,因为这里面默认所有的数据都是需要保留的,所以将其写成 ture,再返回即可。
//默认所有的数据都是需要保留的
val save=true
接下来需要匹配,如果匹配成功,需要将保留改成 false 即可。现在一条数据的 message 格式为下图所列,数据井 CS 井的形式。需要过滤出 Url,其在 request 里面,所以要将 url 的 request 使用井 CS 井截取出来。
书写代码截取出数据当中的 url,先进行判断,这里的 url 也就是 request 它所在的位置是数据当中的第一个、第二个数据,第二个数据下脚标是1。对第二个数据进行判断,if(message.split使用井 CS 井进行拆分,如果拆分完以后,.length 它的长度大于一即二,而这个数据恰好是第二个数据,如果它大于一,那么就返回用它进行切分完后下脚标是一的数据。否则 else 返回为空,前面再做一个接收,即 “val Request”其中 request 相当于请求的数据,其包含了 url。
完整代码为:
//截取出数据中的 url
val request=if(message.split( regex=“#CS#").length>1)
message.split( regex = “#CS#")(1) else "
以上就是截取出来的数据。接下来是遍历数据过滤的规则,规则即为“FilterRuleList”便利它,用 request 与规则去进行匹配来遍历规ze,实际上 url 在其中。此时代码书写为 for(rule<-FilterRuleList),遍历规则需要使用箭头,这里面就是其中的一个规则,然后用 request.match(rule)。如果 match 算了,If 进行判断,如果 match 成功了,表示数据需要删除,即把 save 改成 false,将标记改为 false。代码“val save=true”里面的红线将其改为var即可。改成 false 后,就相当于数据和任意一个(这里都是遍历,有六个或者十几个,一个一个的便历)有任何一个匹配上了,它都表示需要删除,改成 false。改后即代码写完了,因为若匹配不成功,表示不需要返回 ture,但默认就是 ture。
数据过滤完整代码:
//用于数据过滤(过滤无用的数据)
object URLFilter {
//实现数据的过滤功能
deffilterURL(message:String,FilterRuleList:ArrayBuffer[string]):Boolean={
//默认所有的数据都是需要保留的
var save=true
//截取出数据中的 url
val request=if(message.split(regex="#CS#").length>1)
message.split(regex=“#CS#")(1) else””
//遍历数据过滤的规则,拿 request 与过滤规则进行匹配
for(rule<-FilterRuleList){
//若匹配成功表示,需要删除,返回 false
if(request.matches(rule)){
//将标记改为 false
save=false
}
//若匹配不成功表示,表示不需要删除,返回 true
save
}
实现完了后,前面数据进行接收,再将其做一个输出。接收:val 一个变量叫做 Filterdata 过滤后的数据,将这个数据进行输出,再.for each(print line)即可输出。
完整代码为:
//2 数据清洗功能
//定义方法,参数为一条数据和广播变量
val
filteredData=rddfilter(message=>URLFilter.filterURL(message,broadcastFilterRuleList.value filteredData.foreach(println)
以上就是数据清洗过滤代码的过程。