数据格式为 访问时间\t用户ID\t[查询词]\t该URL在返回结果中的排名\t用户点击的顺序号\t用户点击的URL
其中,用户ID是根据用户使用浏览器访问搜索引擎时的Cookie信息自动赋值,即同一次使用浏览器输入的不同查询对应同一个用户ID
使用环境:jupyter notebook
任务:
rdd创建:
logRDD = sc.textFile('file:///home/workspace/data/lycdata/SogouQ.reduced') logRDD.count()输出日志条数:1724264
统计用户在00:00:00到12:00:00之间的查询数 logRDD.map(lambda x : x.split('\t')) .filter(lambda x : 0 <= int(x[0].split(':')[0])*3600 + int(x[0].split(':')[1])*60 + int(x[0].split(':')[2]) <= 12*3600) .count()结果:527300
搜索结果排名第一,但是点击次序排在第二的数据有多少 logRDD.map(lambda x : x.split('\t')) .filter(lambda x : x[3].split(' ')[0] == '1' and x[3].split(' ')[1] == '2') .count()结果:79765
统计每个时间点的查询次数 (得到一个包含的列为:时间,该时间对应的查询次数的PairRDD) time_num_rdd = logRDD.map(lambda x : x.split('\t')).map(lambda x : (x[0], 1) ) # 相同的key做reduce result_rdd = time_num_rdd.reduceByKey(lambda v1, v2: v1 + v2) # 按照key排序 result_rdd_sort = result_rdd.sortByKey() result_rdd_sort.collect()结果如下图: 使用matplotlib对结果进行可视化:
result_list_sort = result_rdd_sort.collect() # time x = [] # query count y = [] for i in range(0, len(result_list_sort)): x.append(result_list_sort[i][0]) y.append(result_list_sort[i][1]) plt.figure(1) plt.plot(range(0,len(x)), y) plt.show() 计算每个小时的用户搜索次数 hour_count_list = result_rdd_sort.map(lambda (x, y): (x.split(':')[0], y)) .reduceByKey(lambda k,v: k+v) .sortByKey().collect()结果:
可视化:
hour_count_list = hour_rdd.collect() # hour x = [] # query count y = [] for i in range(0, len(hour_count_list)): x.append(hour_count_list[i][0]) y.append(hour_count_list[i][1]) 折线图 plt.xlabel("time") plt.ylabel("query_count") plt.title("User query plot") plt.figure(1) plt.plot(x, y) plt.show() 条形图1(使用Axi绘制) fig, ax = plt.subplots() fig.set_figwidth(16) labels = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9','10', '11', '12', '13', '14','15','16','17','18','19','20','21','22','23'] # alpha颜色深浅,width条形宽度(百分比),coler条形颜色 rect = ax.bar( x, y, width=0.6,alpha = .5, color = 'g') # plt.bar(range(len(x)), y, tick_label=labels, alpha = .5, width=0.6, color = 'g') #设置x轴刻度,0.3=width/2,使x轴刻度位于条形图中间部分 ax.set_xticks(np.arange(len(x))+0.3) ax.set_xticklabels(labels) # 设置图例 ax.legend(['hour']) ax.set_xlabel("time") ax.set_ylabel("query_count") ax.set_title("User query plot") # 为每个条形图设置标签 for a, b in zip(x, y): ax.text(a, b+0.05, '%.0f' % b, ha='center', va= 'bottom',fontsize=7) # 显示网格 plt.grid() plt.show() 条形图2(plt绘制) plt.figure(figsize=(8,6)) # align设置刻度和条形图居中 plt.bar(range(len(x)),y,width = 0.6,align='center',color = 'c',alpha=0.5) plt.xticks(range(len(x)),labels,size='small',rotation=30) plt.xlabel(u'time') plt.ylabel(u'query_count') plt.title(u'User query plot') # 为每个条形图设置标签,zip函数接受任意多个(包括0个和1个)序列作为参数,返回一个tuple列表 for a, b in zip(x, y): plt.text(a, b+0.05, '%.0f' % b, ha='center', va= 'bottom',fontsize=7) plt.show()总结:主要是练习SparkRDD的一些基本操作,包括普通RDD与PairRDD,如何把一个普通RDD转换为(key,value)键值对RDD,然后进行统计操作。另一方面是对python可视化工具matplotlib的学习。
