李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
大数据
正文
Spark Core案例实操(六)
Leefs
2021-11-03 PM
3010℃
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://lilinchao.com/archives/1604.html
上一篇
Spark Core案例实操(五)
下一篇
Spark Core案例实操(七)
取消回复
评论啦~
提交评论
栏目分类
随笔
2
Java
326
大数据
229
工具
35
其它
25
GO
48
NLP
8
标签云
Kafka
Redis
JavaWEB项目搭建
队列
Flink
Azkaban
MyBatisX
ClickHouse
Filter
Java编程思想
数据结构和算法
机器学习
链表
SpringBoot
容器深入研究
Netty
Spring
nginx
正则表达式
Jenkins
持有对象
BurpSuite
设计模式
随笔
稀疏数组
Java
Kubernetes
Golang基础
高并发
JavaWeb
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞