当前位置:   article > 正文

六十五、Spark-综合案例(搜狗搜索日志分析)_spark搜狗搜索引擎日志下载

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进行分词并统计如下指标:

  1. 热门搜索词
  2. 用户热门搜索词(带上用户id)
  3. 各个时间段搜索热度

 

业务逻辑

业务逻辑:针对SougoQ用户查询日志数据中不同字段,使用SparkContext读取日志数据,封装到RDD数据集中,调用Transformation函数和Action函数进行处理不同业务统计分析

分词工具

HanLP官网:http://www.sogou.com/labs/resource/q.php

 

         HanLP主要功能:基于HanLP最新技术,使用亿级通用语料库训练,直接API调用,简单高效!

Maven依赖

  1. <dependency>
  2. <groupId>com.hankcs</groupId>
  3. <artifactId>hanlp</artifactId>
  4. <version>portable-1.7.7</version>
  5. </dependency>

HanLP入门案例

  1. package org.example.spark
  2. import java.util
  3. import com.hankcs.hanlp.HanLP
  4. import com.hankcs.hanlp.seg.common.Term
  5. /**
  6. * Author tuomasi
  7. * Desc HanLP入门案例
  8. */
  9. object HanLPTest {
  10. def main(args: Array[String]): Unit = {
  11. val words = "[HanLP入门案例]"
  12. val terms: util.List[Term] = HanLP.segment(words) //分段
  13. println(terms) //直接打印java的list:[[/w, HanLP/nx, 入门/vn, 案例/n, ]/w]
  14. import scala.collection.JavaConverters._
  15. println(terms.asScala.map(_.word)) //转为scala的list:ArrayBuffer([, HanLP, 入门, 案例, ])
  16. val cleanWords1: String = words.replaceAll("\\[|\\]", "") //"[""]"替换为空"" //"HanLP入门案例"
  17. println(cleanWords1) //HanLP入门案例
  18. println(HanLP.segment(cleanWords1).asScala.map(_.word)) //ArrayBuffer(HanLP, 入门, 案例)
  19. val log = """00:00:00 2982199073774412 [360安全卫士] 8 3 download.it.com.cn/softweb/software/firewall/antivirus/20067/17938.html"""
  20. val cleanWords2 = log.split("\\s+")(2) //[360安全卫士]
  21. .replaceAll("\\[|\\]", "") //360安全卫士
  22. println(HanLP.segment(cleanWords2).asScala.map(_.word)) //ArrayBuffer(360, 安全卫士)
  23. }
  24. }

控制台打印效果

 

代码实现

  1. package org.example.spark
  2. import com.hankcs.hanlp.HanLP
  3. import org.apache.spark.rdd.RDD
  4. import org.apache.spark.{SparkConf, SparkContext}
  5. import shapeless.record
  6. import spire.std.tuples
  7. import scala.collection.immutable.StringOps
  8. import scala.collection.mutable
  9. /**
  10. * Author tuomasi
  11. * Desc 需求:对SougouSearchLog进行分词并统计如下指标:
  12. * 1.热门搜索词
  13. * 2.用户热门搜索词(带上用户id)
  14. * 3.各个时间段搜索热度
  15. */
  16. object SougouSearchLogAnalysis {
  17. def main(args: Array[String]): Unit = {
  18. //TODO 0.准备环境
  19. val conf: SparkConf = new SparkConf().setAppName("spark").setMaster("local[*]")
  20. val sc: SparkContext = new SparkContext(conf)
  21. sc.setLogLevel("WARN")
  22. //TODO 1.加载数据
  23. val lines: RDD[String] = sc.textFile("data/input/SogouQ.sample")
  24. //TODO 2.处理数据
  25. //封装数据
  26. val SogouRecordRDD: RDD[SogouRecord] = lines.map(line => { //map是一个进去一个出去
  27. val arr: Array[String] = line.split("\\s+")
  28. SogouRecord(
  29. arr(0),
  30. arr(1),
  31. arr(2),
  32. arr(3).toInt,
  33. arr(4).toInt,
  34. arr(5)
  35. )
  36. })
  37. //切割数据
  38. /* val wordsRDD0: RDD[mutable.Buffer[String]] = SogouRecordRDD.map(record => {
  39. val wordsStr: String = record.queryWords.replaceAll("\\[|\\]", "") //360安全卫士
  40. import scala.collection.JavaConverters._ //将Java集合转为scala集合
  41. HanLP.segment(wordsStr).asScala.map(_.word) //ArrayBuffer(360, 安全卫士)
  42. })*/
  43. val wordsRDD: RDD[String] = SogouRecordRDD.flatMap(record => { //flatMap是一个进去,多个出去(出去之后会被压扁) //360安全卫士==>[360, 安全卫士]
  44. val wordsStr: String = record.queryWords.replaceAll("\\[|\\]", "") //360安全卫士
  45. import scala.collection.JavaConverters._ //将Java集合转为scala集合
  46. HanLP.segment(wordsStr).asScala.map(_.word) //ArrayBuffer(360, 安全卫士)
  47. })
  48. //TODO 3.统计指标
  49. //--1.热门搜索词
  50. val result1: Array[(String, Int)] = wordsRDD
  51. .filter(word => !word.equals(".") && !word.equals("+"))
  52. .map((_, 1))
  53. .reduceByKey(_ + _)
  54. .sortBy(_._2, false)
  55. .take(10)
  56. //--2.用户热门搜索词(带上用户id)
  57. val userIdAndWordRDD: RDD[(String, String)] = SogouRecordRDD.flatMap(record => { //flatMap是一个进去,多个出去(出去之后会被压扁) //360安全卫士==>[360, 安全卫士]
  58. val wordsStr: String = record.queryWords.replaceAll("\\[|\\]", "") //360安全卫士
  59. import scala.collection.JavaConverters._ //将Java集合转为scala集合
  60. val words: mutable.Buffer[String] = HanLP.segment(wordsStr).asScala.map(_.word) //ArrayBuffer(360, 安全卫士)
  61. val userId: String = record.userId
  62. words.map(word => (userId, word))
  63. })
  64. val result2: Array[((String, String), Int)] = userIdAndWordRDD
  65. .filter(t => !t._2.equals(".") && !t._2.equals("+"))
  66. .map((_, 1))
  67. .reduceByKey(_ + _)
  68. .sortBy(_._2, false)
  69. .take(10)
  70. //--3.各个时间段搜索热度
  71. val result3: Array[(String, Int)] = SogouRecordRDD.map(record => {
  72. val timeStr: String = record.queryTime
  73. val hourAndMitunesStr: String = timeStr.substring(0, 5)
  74. (hourAndMitunesStr, 1)
  75. }).reduceByKey(_ + _)
  76. .sortBy(_._2, false)
  77. .take(10)
  78. //TODO 4.输出结果
  79. result1.foreach(println)
  80. result2.foreach(println)
  81. result3.foreach(println)
  82. //TODO 5.释放资源
  83. sc.stop()
  84. }
  85. //准备一个样例类用来封装数据
  86. /**
  87. * 用户搜索点击网页记录Record
  88. *
  89. * @param queryTime 访问时间,格式为:HH:mm:ss
  90. * @param userId 用户ID
  91. * @param queryWords 查询词
  92. * @param resultRank 该URL在返回结果中的排名
  93. * @param clickRank 用户点击的顺序号
  94. * @param clickUrl 用户点击的URL
  95. */
  96. case class SogouRecord(
  97. queryTime: String,
  98. userId: String,
  99. queryWords: String,
  100. resultRank: Int,
  101. clickRank: Int,
  102. clickUrl: String
  103. )
  104. }

效果展现

         注:对SougouSearchLog进行分词并统计出了如下指标,热门搜索词,用户热门搜索词(带上用户id),各个时间段搜索热度,此效果与预期想法基本一致

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/空白诗007/article/detail/945529
推荐阅读
相关标签
  

闽ICP备14008679号