一.数据来源
本次示例所用数据是来自搜狗实验室的用户查询日志。搜索引擎查询日志库设计为包括约1个月(2008年6月)sogou搜索引擎部分网页查询需求及用户点击情况的网页查询日志数据集合。为进行中文搜索引擎用户行为分析的研究者提供基准研究语料。
数据下载地址为:http://sogou/labs/resource/q.php。可以根据自己需求下载不同版本数据,这里下载的是迷你版本的tar.gz格式的文件。
数据格式为
访问时间\t用户id\t[查询词]\t该url在返回结果中的排名\t用户点击的顺序号\t用户点击的url
其中,用户id是根据用户使用浏览器访问搜索引擎时的cookie信息自动赋值,即同一次使用浏览器输入的不同查询对应同一个用户id。:
打开该文件,其内容如下图所示:
2.通过sc读取textfile
val sougou = sc.textfile(g:\\sogouq.txt)
然后通过count来看一下一共有多少条数据
sougou.count()
3.过滤有效数据
过滤出有效数据。步骤如下:
1.首先调用sogou.map(_.split(\\s))方法,根据“\\s符号对rdd中的每行数据进行切分生成一个字符数组;
2.然后调用rdd的filter方法对切分后的数据进行过滤,只保留每个字符数组的长度为6的数据;
3.最后会调用rdd的count方法统计过滤后的数据量。
val filtersg = sougou.map(_.split(\\s)).filter(_.length ==6)println(filtersg.count()) // 10000
注意:下载后的文件格式和官网说的有一点出入,就是该url在返回结果中的排名和用户点击的顺序号之间不是以tab键分隔的,而是以空格分隔,所以如果以split(\t)切分,那么结果就是0,因为length不等于6。此处用到正则,匹配tab键也可以用\\s来匹配。
关于常用正则表达式链接如下:代码+图文讲解spark中scala常用正则匹配
http://blog.csdn/rivercode/article/details/60570620
4.过滤搜索结果排名和点击结果排名都是第一的数据
获得搜索结果排名和点击结果排名都是第一的数据。搜索结果排名对应的是改文件中url在返回结果中的排名,点击结果排名指的是用户点击的顺序号。经过上面第三步过滤的有效数据的操作,已经把每行数据切分成一个长度为6的字符数组,要获得搜索结果排名和点击结果排名都是第一的数据也就是rdd中每个字符数组中第4个元素(索引为3)和第5个元素(索引为4)的值都为1才满足。因此,下面会连续调用两个filter方法来对数据进行过滤,然后调用rdd的count来统计满足要求的数据量。
val rdd = filtersg.filter(_(3).toint == 1).filter(_(4).toint == 1)
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方法把操作结果保存到指定位置的指定目录中。
rdd.map(x => (x(1),1)).reducebykey(_+_).map(x => (x._2,x._1)).sortbykey(false).map(x =>(x._2,x._1)).saveastextfile(g:\\sgresult)
通过saveastextfile后的文件为如下图所示:
6.相关链接:
以上其实已经把完整代码都写完了,如果想下载完整代码,(豪们,会员给点鼓励,多下载。不是会员者,不建议下载,因为基本已是完整代码)链接如下:
spark搜狗日志数据分析实战源码 http://download.csdn/detail/rivercode/9795582
spark累加器介绍-案例通过累加器统计文章中空白行数量 http://blog.csdn/rivercode/article/details/60574856