李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
大数据
正文
Spark Core案例实操(六)
Leefs
2021-11-03 PM
2528℃
0条
[TOC] ### 一、HanLP介绍 **HanLP中文分词**,面向生产环境的自然语言处理工具包,HandLP是由一系列模型与算法组成的Java工具包,目标是普及自然语言处理在生产环境中的应用。 **官方网址**:http://www.hanlp.com/ **添加Maven依赖** ```xml
com.hankcs
hanlp
portable-1.7.7
``` 本次需要在项目中引入HanLP的Maven依赖,进行中文分词。 ### 二、需求 > 对SougouSearchLog进行分词并统计如下指标: > > + 搜索关键词统计 > + 用户搜索点击统计 > + 搜索时间段统计 ### 三、数据准备 #### 3.1 数据下载 数据网址:http://www.sogou.com/labs/resource/q.php 搜狗实验室提供【用户查询日志(SogouQ)】数据分为三个数据集,大小不一样 迷你版(样例数据, 376KB):http://download.labs.sogou.com/dl/sogoulabdown/SogouQ/SogouQ.mini.zip 精简版(1天数据,63MB):http://download.labs.sogou.com/dl/sogoulabdown/SogouQ/SogouQ.reduced.zip 完整版(1.9GB):http://www.sogou.com/labs/resource/ftp.php?dir=/Data/SogouQ/SogouQ.zip #### 3.2 数据说明  + 第一列:访问时间 + 第二列:用户ID + 第三列:查询词 + 第四列:该URL在返回结果中的排名 + 第五列:用户点击的顺序号 + 第六列:用户点击的URL ### 四、实现 #### 4.1 步骤 ``` 1. 加载数据 2. 处理数据 - 切割数据 - 取出搜索词 - 对搜索词进行分词 3. 统计指标 - 热门搜索词 - 用户热门搜索词(带上用户id) - 各个时间段搜索热度 4. 输出结果 5. 释放资源 ``` #### 4.2 代码 ```scala import com.hankcs.hanlp.HanLP import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} import scala.collection.mutable /** * @author lilinchao * @date 2021/11/3 * @description 对SougouSearchLog进行分词并统计如下指标: * 1.热门搜索词 * 2.用户热门搜索词(带上用户id) * 3.各个时间段搜索热度 **/ object SougouSearchLogAnalysis { def main(args: Array[String]): Unit = { val conf: SparkConf = new SparkConf().setAppName("SougouSearchLogAnalysis").setMaster("local[*]") val sc: SparkContext = new SparkContext(conf) //1.加载数据 val lines: RDD[String] = sc.textFile("datas/SogouQ.sample") //2.处理数据 val SogouRecordRDD: RDD[SogouRecord] = lines.map(line => { val arr:Array[String] = line.split("\\s+") SogouRecord( arr(0), arr(1), arr(2), arr(3).toInt, arr(4).toInt, arr(5) ) }) //2.1 切割数据 val wordsRDD:RDD[String] = SogouRecordRDD.flatMap(record => { //取出搜索词 val wordsStr: String = record.queryWords.replaceAll("\\[|\\]", "") //将Java集合转为scala集合 import scala.collection.JavaConverters._ //对搜索词进行分词 HanLP.segment(wordsStr).asScala.map(_.word) }) //3.统计指标 //3.1 热门搜索词 val result1: Array[(String, Int)] = wordsRDD .filter(word => !word.equals(".") && !word.equals("+")) .map((_,1)) .reduceByKey(_ + _) .sortBy(_._2,false) .take(10) //3.2 用户热门搜索词(带上用户id) val userIdAndWordRDD: RDD[(String, String)] = SogouRecordRDD.flatMap(record => { val wordsStr: String = record.queryWords.replaceAll("\\[|\\]", "") import scala.collection.JavaConverters._ //将Java集合转为scala集合 val words: mutable.Buffer[String] = HanLP.segment(wordsStr).asScala.map(_.word) val userId: String = record.userId words.map(word => (userId, word)) }) val result2: Array[((String, String), Int)] = userIdAndWordRDD .filter(t => !t._2.equals(".") && !t._2.equals("+")) .map((_, 1)) .reduceByKey(_ + _) .sortBy(_._2, false) .take(10) //3.3 各个时间段搜索热度 val result3: Array[(String, Int)] = SogouRecordRDD.map(record => { val timeStr: String = record.queryTime val hourAndMitunesStr: String = timeStr.substring(0, 5) (hourAndMitunesStr, 1) }).reduceByKey(_ + _) .sortBy(_._2, false) .take(10) //4.输出结果 result1.foreach(println) result2.foreach(println) result3.foreach(println) //5. 释放资源 sc.stop() } /** * 用户搜索点击网页记录Record * @param queryTime 访问时间,格式为:HH:mm:ss * @param userId 用户ID * @param queryWords 查询词 * @param resultRank 该URL在返回结果中的排名 * @param clickRank 用户点击的顺序号 * @param clickUrl 用户点击的URL */ case class SogouRecord( queryTime: String, userId: String, queryWords: String, resultRank: Int, clickRank: Int, clickUrl: String ) } ``` **运行结果** ``` (地震,599) (的,476) (汶川,430) (原因,360) (救灾,323) (哄抢,321) (物资,321) (com,278) (图片,258) (下载,248) ((1011517038707826,主题),27) ((7230120314300312,全集),21) ((7230120314300312,阅读),20) ((7650543509505572,治疗),19) ((7650543509505572,的),19) ((7650543509505572,孤独症),19) ((2512392400865138,拳皇),19) ((1011517038707826,手机),19) ((7650543509505572,儿童),19) ((9026201537815861,scat),19) (00:02,1088) (00:04,1056) (00:03,1051) (00:00,1046) (00:01,1046) (00:06,1036) (00:08,1024) (00:05,1024) (00:07,999) (00:09,630) ```
标签:
Spark
,
Spark Core
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:
https://www.lilinchao.com/archives/1604.html
上一篇
Spark Core案例实操(五)
下一篇
Spark Core案例实操(七)
取消回复
评论啦~
提交评论
栏目分类
随笔
2
Java
326
大数据
229
工具
35
其它
25
GO
48
NLP
8
标签云
数据结构
Java阻塞队列
JavaWEB项目搭建
Ray
算法
BurpSuite
GET和POST
字符串
Filter
HDFS
哈希表
Map
Sentinel
Scala
ClickHouse
前端
数学
Netty
Nacos
数据结构和算法
FileBeat
Beego
递归
pytorch
微服务
工具
MyBatis-Plus
并发线程
Elastisearch
SQL练习题
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞