程序笔记   发布时间:2022-07-18  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了spark搜狗日志数据分析实战大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

一.数据来源

本次示例所用数据是来自搜狗实验室的用户查询日志。搜索引擎查询日志库设计为包括约1个月(2008年6月)Sogou搜索引擎部分网页查询需求及用户点击情况的网页查询日志数据集合。为进行中文搜索引擎用户行为分析的研究者提供基准研究语料。

数据@R_772_11313@址为:http://www.sogou.com/labs/resource/q.php。可以根据自己需求下载不@R_518_11197@数据,这里下载的是迷你版本的tar.gz格式的文件。

数据格式为

访问时间t用户IDt[查询词]t该URL在返回结果中的排名t用户点击的顺序号t用户点击的URL 其中,用户ID是根据用户使用浏览器访问搜索引擎时的Cookie信息自动赋值,即同一次使用浏览器输入的不同查询对应同一个用户ID。:

打开该文件,其内容如下图所示:

![](https://img- blog.csdn.net/20170327174006334?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvUml2ZXJDb2Rl/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)

2.通过sc读取textFile

    val sougou = sc.textFile("G:\SogouQ.txt")
[/code]

然后通过count来看一下一共有多少条数据

```code
    sougou.count()
[/code]

#  3.过滤有效数据

过滤出有效数据。步骤如下:

1.首先调用sogou.map(_.split("\s"))方法,根据“\s"符号对RDD中的每行数据进行切分生成一个字符数组;

2.然后调用RDD的filter方法对切分后的数据进行过滤,只保留每个字符数组的长度为6的数据;

3.最后会调用RDD的count方法统计过滤后的数据量。

```code
    val filterSG = sougou.map(_.split("\s")).filter(_.length ==6)
[/code]

[/code]

```code
    println(filterSG.count()) // 10000
[/code]

注意:下载后的文件格式和官网说的有一点出入,就是该URL在返回结果中的排名和用户点击的顺序号之间不是以Tab键分隔的,而是以空格分隔,所以如果以split("t")切分,那么结果就是0,因为length不等于6。
此处用到  正则,匹配Tab键也可以用\s来匹配。

关于常用正则表达式链接如下: [ 代码+图文讲解spark中scala常用正则匹配
](http://blog.csdn.net/rivercode/article/details/60570620)

http://blog.csdn.net/rivercode/article/details/60570620  

#  4.过滤搜索结果排名和点击结果排名都是第一的数据

获得搜索结果排名和点击结果排名都是第一的数据。搜索结果排名对应的是改文件中URL在返回结果中的排名,点击结果排名指的是用户点击的顺序号。经过上面第三步过滤的有效数据的操作,已经把每行数据切分成一个长度为6的字符数组,要获得搜索结果排名和点击结果排名都是第一的数据也就是RDD中每个字符数组中第4个元素(索引为3)和第5个元素(索引为4)的值都为1才满足。因此,下面会连续调用两个filter方法来对数据进行过滤,然后调用RDD的count来统计满足要求的数据量。

```code
    val rdd = filterSG.filter(_(3).toInt == 1).filter(_(4).toInt == 1)
[/code]

#  5.计算用户查询次数排行榜(降序)

计算用户查询次数排行榜(降序),并把结果存储到G盘里的sgresult文件夹下。用户的查询次数指的是每个用户一共查询了多少单词,也就是指同样的用户ID一共查询了多少单词。这里已经在第四步生成的rdd的基础上来计算用户查询次数排行榜。步骤如下:

1.首先,会调用rdd的map方法把rdd中的每个字符数组中索引为1的元素通过一个函数生成key-value型的元组;

2.然后,调用RDD的reduceByKey方法对key相同的元素进行求和操作;

3.再调用map方法调整每个元组中key和value的顺序;

4.接着调用sortByKey方法对交换过key和value顺序的元组按照key的大小进行降序排序;

5.之后,再交换每个元组的key和value的顺序;

6.最后通过saveAsTextFile方法把操作结果保存到指定位置的指定目录中。

```code
    rdd.map(x => (x(1),1)).reduceByKey(_+_).map(x => (x._2,x._1)).sortByKey(false).map(x => (x._2,x._1)).saveAsTextFile("G:\sgresult")
[/code]

通过saveAsTextFile后的文件为如下图所示:

![](https://img-
blog.csdn.net/20170327171537713?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvUml2ZXJDb2Rl/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)  

#  6.相关链接:

以上其实已经把完整代码都写完了,如果想下载完整代码,(豪们,会员给点鼓励,多下载。不是会员者,不建议下载,因为基本已是完整代码)链接如下:

[ spark搜狗日志数据分析实战源码(搜索结果和点击排名都是第一)
](http://download.csdn.net/detail/rivercode/9801250)
http://download.csdn.net/detail/rivercode/9801250

[ spark累加器介绍-案例通过累加器统计文章中空白行数量
](http://blog.csdn.net/rivercode/article/details/60574856)
http://blog.csdn.net/rivercode/article/details/60574856  

[ spark搜狗日志数据分析实战源码 ](http://download.csdn.net/detail/rivercode/9795582)
http://download.csdn.net/detail/rivercode/9795582  

  

  

  

  

  

  

  

  

  

  

  


![在这里插入图片描述](https://img-blog.csdnimg.cn/20210608151750993.gif)

大佬总结

以上是大佬教程为你收集整理的spark搜狗日志数据分析实战全部内容,希望文章能够帮你解决spark搜狗日志数据分析实战所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。