李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
大数据
正文
Spark Core案例实操(六)
Leefs
2021-11-03 PM
1658℃
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 数据说明 ![16.Spark Core案例实操(六)01.jpg](https://lilinchao.com/usr/uploads/2021/11/2709655957.jpg) + 第一列:访问时间 + 第二列:用户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://lilinchao.com/archives/1604.html
上一篇
Spark Core案例实操(五)
下一篇
Spark Core案例实操(七)
评论已关闭
栏目分类
随笔
2
Java
326
大数据
229
工具
31
其它
25
GO
47
NLP
4
标签云
Sentinel
设计模式
队列
Filter
并发线程
BurpSuite
FastDFS
数据结构和算法
SQL练习题
并发编程
JavaScript
Hive
二叉树
排序
高并发
Java阻塞队列
MyBatis
HDFS
序列化和反序列化
数据结构
机器学习
MyBatisX
Spark
递归
VUE
Spring
Stream流
Quartz
GET和POST
链表
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞
评论已关闭