六十五、Spark-综合案例(搜狗搜索日志分析)
搜狗实验室:搜索引擎查询日志库设计为包括约1个月(2008年6月)Sogou搜索引擎部分网页查询需求及用户点击情况的网页查询日志数据集合。为进行中文搜索引擎用户行为分析的研究者提供基准研究语料
目录
原数据展示
业务需求
业务逻辑
分词工具
Maven依赖
代码实现
效果展现
搜狗搜索日志官网:http://www.sogou.com/labs/resource/q.php
迷你版日志下载链接:http://download.labs.sogou.com/dl/sogoulabdown/SogouQ/SogouQ.mini.zip
注:由于进行测试使用,迷你版数据就可以满足需求
原数据展示
注:原数据存在10000条 ,字段分别为:访问时间 \t 用户ID \t [查询词] \t 该URL在返回结果中的排名 \t 用户点击的顺序号 \t 用户点击的URL
业务需求
需求说明: 对SougouSearchLog进行分词并统计如下指标:
- 热门搜索词
- 用户热门搜索词(带上用户id)
- 各个时间段搜索热度
业务逻辑
业务逻辑:针对SougoQ用户查询日志数据中不同字段,使用SparkContext读取日志数据,封装到RDD数据集中,调用Transformation函数和Action函数进行处理不同业务统计分析
分词工具
HanLP官网:http://www.sogou.com/labs/resource/q.php
HanLP主要功能:基于HanLP最新技术,使用亿级通用语料库训练,直接API调用,简单高效!
Maven依赖
<dependency>
<groupId>com.hankcs</groupId>
<artifactId>hanlp</artifactId>
<version>portable-1.7.7</version>
</dependency>
HanLP入门案例
package org.example.sparkimport java.utilimport com.hankcs.hanlp.HanLP import com.hankcs.hanlp.seg.common.Term/*** Author tuomasi* Desc HanLP入门案例*/ object HanLPTest {def main(args: Array[String]): Unit = {val words = "[HanLP入门案例]"val terms: util.List[Term] = HanLP.segment(words) //分段println(terms) //直接打印java的list:[[/w, HanLP/nx, 入门/vn, 案例/n, ]/w]import scala.collection.JavaConverters._println(terms.asScala.map(_.word)) //转为scala的list:ArrayBuffer([, HanLP, 入门, 案例, ])val cleanWords1: String = words.replaceAll("\\[|\\]", "") //将"["或"]"替换为空"" //"HanLP入门案例"println(cleanWords1) //HanLP入门案例println(HanLP.segment(cleanWords1).asScala.map(_.word)) //ArrayBuffer(HanLP, 入门, 案例)val log = """00:00:00 2982199073774412 [360安全卫士] 8 3 download.it.com.cn/softweb/software/firewall/antivirus/20067/17938.html"""val cleanWords2 = log.split("\\s+")(2) //[360安全卫士].replaceAll("\\[|\\]", "") //360安全卫士println(HanLP.segment(cleanWords2).asScala.map(_.word)) //ArrayBuffer(360, 安全卫士)} }
控制台打印效果
代码实现
package org.example.sparkimport com.hankcs.hanlp.HanLP
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}
import shapeless.record
import spire.std.tuplesimport scala.collection.immutable.StringOps
import scala.collection.mutable/*** Author tuomasi* Desc 需求:对SougouSearchLog进行分词并统计如下指标:* 1.热门搜索词* 2.用户热门搜索词(带上用户id)* 3.各个时间段搜索热度*/
object SougouSearchLogAnalysis {def main(args: Array[String]): Unit = {//TODO 0.准备环境val conf: SparkConf = new SparkConf().setAppName("spark").setMaster("local[*]")val sc: SparkContext = new SparkContext(conf)sc.setLogLevel("WARN")//TODO 1.加载数据val lines: RDD[String] = sc.textFile("data/input/SogouQ.sample")//TODO 2.处理数据//封装数据val SogouRecordRDD: RDD[SogouRecord] = lines.map(line => { //map是一个进去一个出去val arr: Array[String] = line.split("\\s+")SogouRecord(arr(0),arr(1),arr(2),arr(3).toInt,arr(4).toInt,arr(5))})//切割数据/* val wordsRDD0: RDD[mutable.Buffer[String]] = SogouRecordRDD.map(record => {val wordsStr: String = record.queryWords.replaceAll("\\[|\\]", "") //360安全卫士import scala.collection.JavaConverters._ //将Java集合转为scala集合HanLP.segment(wordsStr).asScala.map(_.word) //ArrayBuffer(360, 安全卫士)})*/val wordsRDD: RDD[String] = SogouRecordRDD.flatMap(record => { //flatMap是一个进去,多个出去(出去之后会被压扁) //360安全卫士==>[360, 安全卫士]val wordsStr: String = record.queryWords.replaceAll("\\[|\\]", "") //360安全卫士import scala.collection.JavaConverters._ //将Java集合转为scala集合HanLP.segment(wordsStr).asScala.map(_.word) //ArrayBuffer(360, 安全卫士)})//TODO 3.统计指标//--1.热门搜索词val result1: Array[(String, Int)] = wordsRDD.filter(word => !word.equals(".") && !word.equals("+")).map((_, 1)).reduceByKey(_ + _).sortBy(_._2, false).take(10)//--2.用户热门搜索词(带上用户id)val userIdAndWordRDD: RDD[(String, String)] = SogouRecordRDD.flatMap(record => { //flatMap是一个进去,多个出去(出去之后会被压扁) //360安全卫士==>[360, 安全卫士]val wordsStr: String = record.queryWords.replaceAll("\\[|\\]", "") //360安全卫士import scala.collection.JavaConverters._ //将Java集合转为scala集合val words: mutable.Buffer[String] = HanLP.segment(wordsStr).asScala.map(_.word) //ArrayBuffer(360, 安全卫士)val userId: String = record.userIdwords.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.各个时间段搜索热度val result3: Array[(String, Int)] = SogouRecordRDD.map(record => {val timeStr: String = record.queryTimeval hourAndMitunesStr: String = timeStr.substring(0, 5)(hourAndMitunesStr, 1)}).reduceByKey(_ + _).sortBy(_._2, false).take(10)//TODO 4.输出结果result1.foreach(println)result2.foreach(println)result3.foreach(println)//TODO 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)
}
效果展现
注:对SougouSearchLog进行分词并统计出了如下指标,热门搜索词,用户热门搜索词(带上用户id),各个时间段搜索热度,此效果与预期想法基本一致
六十五、Spark-综合案例(搜狗搜索日志分析)相关推荐
- 大数据综合案例--搜狗搜索日志分析
文档连接: https://pan.baidu.com/s/1Eq85aWfSUXTCqk5EKo8zPQ 数据链接: https://pan.baidu.com/s/1Y7qQPjBaAvLnnCQ ...
- 搜狗搜索日志分析系统
实验手册--搜狗搜索日志分析系统 转载:https://www.cnblogs.com/biehongli/p/8074642.html 前奏:请提前搭建好你的集群和必要的软件:hadoop + jd ...
- 实验手册——搜狗搜索日志分析系统
前奏:请提前搭建好你的集群和必要的软件:hadoop + jdk + hive + Sqoop + HBase: 数据(链接是网友的,感谢,感谢,感谢.里面有测试数据):链接:http://pan.b ...
- Spark综合学习笔记(三)搜狗搜索日志分析
学习致谢: https://www.bilibili.com/video/BV1Xz4y1m7cv?p=36 一. 数据 数据网站: http: //www.sogou.com/labs/resour ...
- 搜狗搜索日志分析系统500w数据(实现数据分析需求一至五)
四.实现数据分析需求一:条数统计 数据总条数: hive> select count(*) from sogou.sogou_ext_20111230; 非空查询条数 hive> sele ...
- 六十五年来,他的祖国向他道歉了三次
△ "人工智能之父"艾伦 · 麦席森 · 图灵 (Alan Mathison Turing,1912-1954) 2021年6月23日是英国科学家."人工智能之父&quo ...
- [Python从零到壹] 六十.图像识别及经典案例篇之基于阈值及边缘检测的图像分割
欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...
- 六十五、Leetcode数组系列(上篇)
@Author:Runsen @Date:2020/6/5 作者介绍:Runsen目前大三下学期,专业化学工程与工艺,大学沉迷日语,Python, Java和一系列数据分析软件.导致翘课严重,专业排名 ...
- JavaScript学习(六十五)—数组知识点总结
JavaScript学习(六十五)-数组 学习内容 一.什么是数组 二.数组的分类 三.数组的创建方式 四.数组元素 五.数组的操作 六.数组元素遍历的四种方法 七.随机数为数组赋值 八.数组的比较 ...
最新文章
- python 拼多多秒杀_关于 拼多多笔试题-简单易懂的秒杀服务
- 【docker】linux系统centOS 7上安装docker
- JUC多线程:synchronized锁机制原理 与 Lock锁机制
- LintCode 402: Continuous Subarray Sum
- HDFS写入和读取过程
- 改变Android的hello world程序字体颜色和背景颜色
- ES5-9 【utils】构造函数及实例化原理、包装类
- linux 车载视频监控,基于Linux平台车载视频监控系统研发-计算机科学与技术专业论文.docx...
- 明源云·天际,地产⾏业的Salesforce Lightning Platform
- CSS的三种定位,成功入职字节跳动
- jquery指定节点设css,jquery 获取和设置节点属性 css样式
- left join嵌套selelct语句格式_SQL Formatting Rule 格式化行业规范
- Redis 常见延迟问题排查手册
- java 图片处理_java图片处理功能介绍
- matlab求单自由度振动方程为,matlab求解振动方程
- 流水灯程序总结:关于Crol和cror的用法
- 鼠标计算机英语怎么说,鼠标英语
- php addslashes 防注入,PHP基础-addslashes防sql注入-北漂者
- TCP-Drinc:Smart Congestion Control Based on Deep Reinforcement Learning笔记
- C#必须加某QQ群才能使用软件
热门文章
- DLX 项目总结(Deluxe processor)
- 学习李沐的课程中的问题记录
- 名智新系统的调试方法(转)
- 丰和的折价率可能超过50%
- android tween动画平移怎么设置时间,android Tween Animation属性设置方法实例
- Mat 颜色空间转换
- 风雨二十年互联网中国之路
- 从零学习VINS-Mono/Fusion源代码(五):VIO初始化
- 【论文相关】论文管理神器-zotero(最详细的使用说明)
- 导入自己模块包导入报错:ModuleNotFoundError: No module named ‘xxx‘解决方法 晓物智联