学习感谢——数据网站需要为用户查询日志数据中的不同字段,使用阅读日志数据,打包成数据集,调用函数进行不同的业务统计和分析。三字工具的测试使用了一个流行且易于使用的面向生产环境的中文语言处理工具包,由一系列模块组成。
学习感谢:https://www.bilibili.com/video/BV1Xz4y1m7cv? p = 36
一.数据网站:http://www.sogou.com/labs/resource/q.php.
第二,根据SougoQ用户查询日志数据中的不同字段,使用SparkContext读取日志数据,封装成RDD数据集,调用变换函数和动作函数对不同服务进行统计分析。
第三,分词工具测试使用了一个流行且易于使用的中文分区:HanLP,一个面向生产环境的自然语言处理工具包。HanLP是由一系列模型和算法组成的Java工具包,目标是普及自然语言处理在生产环境中的应用。官方网站:http://www.hanlp.com/增加maven依赖。
com . hankcshanlpportable -1 . 7 . 7 import com . hankcs . HanLP . hanlpimport com . hankcs . HanLP . seg . common . TERM import Scala . collection . java converters . _ object HanLP Test { object Han lptest { def main(args:array[string]):unit = { val words = "[Han LP入门案例]" val terms:util . list[$ TERM]= HanLP . segment(words)//println(TERM)//直接打印Java列表:[[/w,HanLP/ascala.map (_)。word))//转换成scaLa的List:ArrayBuffer([,HanLP,introduction,case,]) valclean words1: string = words。replaceall ("hm [/nn]"," ")//用空" "//"HanLP条目大小写" println(cleanwords1)//HanLP条目大小写println (Han LP。段(净字1)。阿斯卡拉。地图(_。word))// ArrayBuffer (HanLP,入门,大小写)vallog = " " E:00:00 2982199073774412[360安全卫士]83 download . it . com . cn/soft web/soft/software/firewall/anti virus/20036/179 " " " valcleanwords 2 = log . split(" ils+"(2)//7[360安全卫士] println (Han LP .段(cleanwords2)。阿斯卡拉。地图(_。word))//ArrayBuffer (360,安全卫士)}
第四,代码实现
导入com . hankcs . hanlp . hanlpimport org . Apache . spark . rdd . rddimport org . Apache . spark . { spark conf,Sparkcontext}导入scala.collection.mutable/** *作者* Desc要求:SougouSearchLog的分段及以下指标的统计* 1 .热门搜索词* 2。用户热门搜索词(带用户id) * 3。各时间段搜索热度*/ Object SougouSearch分析{ def main(args:array[string]):unit = {//todo 0。准备环境valconf: Sparkconf = New Sparkconf()。设置appname ("Spark ")。。set master(" local[*]")val sc:spark context = new spark context(conf)sc。设置日志级别(" warn")//todo1。加载数据值行:RDD[字符串]。= sc。textfile(" data/sogouq . sample ")//todo 2。处理数据//封装数据Valsogourecordrdd:RDD[sogourecord]= lines . Map(line = > {//Map是一个var arr:array[string]= line . split("//s+")sogourecord(arr(0),arr (1),arr (2),arr (3)。Toint,arr(4)。toInt,Arr(5)})//切割数据val words RDD:RDD[string]= sogourecordrd。Flatmap (record = > {//Flatmap是一个进出都会被压扁的安全卫士= = "[360,安全卫士]val words str:string = record . query words . replace all("///[|/]"," ")//360安全卫士import scala . collection . Java converters . _//将Java集合转换为Scala集合hanlp.segment (wordstr)。assiscala.map (_)。word)//ArrayBuffer (360,安全卫士)}) //TODO 3。统计指标//1。热门搜索词ValResult 1: Array [(string,int)] = wordsrdd.filter (word = >!word.equals("。")&& !word . equals(“+”)。映射((_,1))。reduceByKey(_+_)。sortBy(_。_2,假)。取(10) // 2。热门用户搜索词(带用户ID)valuseridandworrdd:rdd[(String,String)] = sogourecordrd。flatmap (record = > {//flatmap是一个多次进去都会被压扁的安全卫士//360 = "[360,安全卫士]val words str:string = record . query words . replace all("///[|/]"," ")//360安全卫士import scala . collection . Java converters . _//将Java集合转换为Scala集合val words:mutable . buffer[string]= hanlp . segment(wordstr)。。cascade.map (_。word)//ArrayBuffer (360,安全卫士)ValuserID:string = record . userID words . map(word = >(userID,word))})val result 2:Array[((String,String),Int)]= useridandworrdd。过滤器(word= >!词。_2.equals(" . ")&& !词。_ 2.等于(“+”)。映射((_,1))。ReducebyKey (_+_)。Sortby (_。_ 2,假)。取(10)//3。每个时间段内的搜索热度val result3: Array[(String,Int)]= sogourecorrddd . map(record = > { val timeStr:String = record . query time val hourandminnesstr:String = timeStr . substring(0,5)(hourandminnesstr,1) })。reduceByKey(_+_)。sortBy(_。_2,假)。take(10) //TODO 4。输出结果1。Foreach (println)结果2。Foreach (println)结果3。Foreach (println)// TODO 5。Release resources sc.stop() }//准备一个样本类封装数据}/* *用户搜索并点击网页,记录record的访问时间*@param queryTime。格式为:HH:mm:ss *@param userId用户ID *@param queryWords查询词* @ param result rank URL在返回结果中的排名*@param clickRank用户点击的序号* @ param click URL URL */caseclasssogourecord(query time:String,userid: string,queryWords:String,resultRank:Int,clickRank:Int,clickUrl:String)
评论前必须登录!
注册