案例介绍
有如下的搜索日志 search_log.txt
00:00:00 2982199073774412 传智播客 8 3 http://www.itcast.cn
00:00:00 07594220010824798 黑马程序员 1 1 http://www.itcast.cn
00:00:00 5228056822071097 传智播客 14 5 http://www.itcast.cn
00:00:00 6140463203615646 博学谷 62 36 http://www.itcast.cn
00:00:00 8561366108033201 IDEA 3 2 http://www.itcast.cn
00:00:00 23908140386148713 传智专修学院 1 2 http://www.itcast.cn
23:00:00 1797943298449139 flume 8 5 http://www.itcast.cn
23:00:00 00717725924582846 itcast 1 2 http://www.itcast.cn
23:00:00 41416219018952116 bigdata 2 6 http://www.itcast.cn
23:00:00 9975666857142764 IDEA 2 2 http://www.itcast.cn
23:00:00 21603374619077448 酷丁鱼 1 6 http://www.itcast.cn
23:00:00 7423866288265172 bigdata 3 13 http://www.itcast.cn
23:00:00 0616877776407358 itcast 2 9 http://www.itcast.cn
23:00:00 3933365481995287 flume 6 3 http://www.itcast.cn
23:00:00 8242389147671512 数据仓库 2 3 http://www.itcast.cn
23:00:00 8248403977107859 传智汇 1 1 http://www.itcast.cn
23:00:00 6239728533154822 itheima 7 9 http://www.itcast.cn
23:00:00 6551182914925117 itcast 6 4 http://www.itcast.cn
23:00:00 2345161545038265 传智汇 2 1 http://www.itcast.cn
23:00:00 06478452674857782 hadoop 4 1 http://www.itcast.cn
23:00:00 23405445793591878 博学谷 4 5 http://www.itcast.cn
23:00:00 23457845712802688 hadoop 4 1 http://www.itcast.cn
23:00:00 4625224675315291 spark 2 6 http://www.itcast.cn
....
需求
- 热门搜索时间段TOP3
- 热门搜索词TOP3
- 统计 “黑马程序员” 在什么时间段被搜索最多
- 将数据转为JSON格式
实现代码
from pyspark import SparkConf, SparkContext
import json
import os
# 1.让PySpark知道Python的解释器位置
os.environ['PYSPARK_PYTHON'] = "C:/Python310/python.exe"
conf = SparkConf().setMaster("local[*]").setAppName("test_spark")
sc = SparkContext(conf=conf)
file_rdd = sc.textFile("./search_log.txt")
# 需求1:热门搜索时间段TOP3
# 1.1 取出全部的时间转为小时
# 1.2 转为(小时, 1)的二元元组
# 1.3 key分组聚合 reduceByKey
# 1.4 排序
# 1.5 取前三
result1 = file_rdd.map(lambda x: (x.split("\t")[0][:2], 1)).\
reduceByKey(lambda a, b: a + b).\
sortBy(lambda x: x[1], ascending=False, numPartitions=1).\
take(3)
print("热门搜索时间段TOP3:", result1)
# 需求2:热门搜索词Top3
# 2.1 取出全部搜索词
# 2.2 组成(搜索词, 1) 的二元元组
# 2.3 分组聚合 reduceByKey
# 2.4 排序
# 2.5 求Top3
result2 = file_rdd.map(lambda x:(x.split("\t")[2], 1)).\
reduceByKey(lambda a, b: a + b).\
sortBy(lambda x: x[1], ascending=False, numPartitions=1).\
take(3)
print("热门搜索词Top3:", result2)
# 需求3: 统计 "黑马程序员" 在什么时间段被搜索最多
# 3.1 过滤内容,只保留关键词为黑马程序员的list
# 3.2 转换为(小时, 1)的二元元组
# 3.3 分组聚合 reduceByKey
# 3.4 排序
# 3.5 最大
result3 = file_rdd.map(lambda x:x.split("\t")).\
filter(lambda x :x[2] == '黑马程序员').\
map(lambda x:(x[0][:2], 1)).\
reduceByKey(lambda a, b: a + b).\
sortBy(lambda x: x[1], ascending=False, numPartitions=1).\
take(1)
print("'黑马程序员'被搜索最多的时段:",result3)
# 需求4: 将数据转为JSON格式
rdd_json = file_rdd.map(lambda x: x.split("\t")).\
map(lambda x: {"time": x[0], "user_id": x[1], "key_word": x[2], "rank1": x[3], "rank2": x[4], "url": x[5]})
输出结果:
热门搜索时间段TOP3: [(‘20’, 3479), (‘23’, 3087), (‘21’, 2989)]
热门搜索词Top3: [(‘scala’, 2310), (‘hadoop’, 2268), (‘博学谷’, 2002)]
'黑马程序员’被搜索最多的时段: [(‘22’, 245)]