本节所用的数据是来自搜狗实验室的用户查询日志(SogouQ),该日志数据是搜索引擎查询日志库设计的为包括约1个月的Sogou搜索引擎部分网页查询需求及用户点击情况的网页查询日志数据集合。为进行中文搜索引擎用户行为分析的研究者提供基准研究语料。
数据下载地址为:http://www.sogou.com/labs/dl/q.html。用户可以根据自己的Spark机器配置的实际情况选择下载不同的版本,这里我们使用的是迷你版本的tar.gz格式的文件,其大小为211 KB,打开该文件,其内容如图3-4所示。
该文件的格式是:访问时间\t用户ID\t查询词\t该URL在返回结果中的排名\t用户点击的顺序号\t用户点击的URL。
用“hadoop fs-copyFromLocal SogouQ.mini/data”命令把文件复制到HDFS文件系统的data目录下。从Web控制台看一下该文件(如图3-5所示)。
下面我们来动手操作搜狗实验室的日志文件:
(1)通过sc(SparkContext的实例对象)的textFile方法读取已经上传到HDFS上的

图3-4 搜狗日志文件

图3-5 HDFS上存储的SogouQ.mini文件
SogouQ.mini文件,生成一个RDD(变量名称为sougou),然后调用sougou.count来看一下一共有多少条数据。


通过以上运行结果的最后一行,我们可以知道加载进来的SogouQ.mini文件中一共有2000条数据。
(2)过滤出有效的数据。首先调用sougou.map(_.split(“\t”))方法,根据“\t”这个符号对RDD中的每行数据进行切分生成一个字符数组,然后会调用RDD的filter方法对切分后的数据进行过滤,只保留每个字符数组的长度为6的数据,最后会调用RDD的count方法来统计一下过滤后的数据量。
(https://www.xing528.com)
通过以上运行结果,我们知道对加载进来的SogouQ.mini文件进行过滤操作后,满足要求的数据还是2000条。
(3)获得搜索结果排名和点击结果排名都是第一的数据。搜索结果排名对应的是该文件中URL在返回结果中的排名,点击结果排名指的是用户点击的顺序号。经过上面第2步过滤有效数据的操作,我们已经把每行数据切分成一个长度为6的字符数组,要获得搜索结果排名和点击结果排名都是第一的数据也就是RDD中每个字符数组中第4个元素(索引为3)和第5个元素(索引为4)的值都为1才满足。因此在下面我们会连续调用两个filter方法来对数据进行过滤,然后调用RDD的count来统计满足要求的数据量。

经过以上操作,我们发现,搜索结果排名和点击结果排名都是第一的数据一共有794条。
(4)计算用户查询次数排行榜(降序),并把结果存储到HDFS文件的“/data/sgqResult”目录下。用户的查询次数指的是每个用户一共查询了多少单词,也就是指同样的用户ID一共查询了多少单词。这里我们在上面第3步生成的rdd3的基础上来计算用户查询次数排行榜,首先会调用rdd3的map方法把rdd3中的每个字符数组中索引为1的元素通过一个函数生成key-value型的元组;然后调用RDD的reduceByKey方法对key相同的元素进行求和操作;再调用map方法调整每个元组中key和value的顺序;接着调用sortByKey方法对交换过key和value顺序的元组按照key的大小进行降序排序;之后在交换每个元组的key和value的顺序;最后通过saveAsTextFile方法把操作结果保存到HDFS文件系统中的sgqResult目录下。

由于我们把运行结果保存到了HDFS文件系统中,所以在shell控制台看不到保存后的文件,需要到Web控制台查看结果(如图3-6所示)。在HDFS的data目录下存储了名称为sgqResule的文件

图3-6 查询次数排行榜计算结果sgqResult
这时我们在shell命令终端通过Hadoop的命令把sgqResult目录下的两个文件的内容合并成一个名称为CombinedResult的文件,然后可以在本地查看该文件。命令如下:

使用“head”命令查看一下合并后的本地文件内容:

head命令本身只能显示10行数据,其中第1列是用户ID,第2列是用户ID对应的查询次数,且查询次数是按降序排列进行存储和显示的。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。
