# 搜索引擎日志分析案例
from pyspark import SparkConf, SparkContext
from operator import add
import jieba
from pyspark.storagelevel import StorageLevel
conf = SparkConf().setAppName("SougouQ").setMaster('local[*]')
sc = SparkContext(conf=conf)
# 读取数据文件
input_file = "../pySpark/data/SogouQ.txt"
file_rdd = sc.textFile(input_file)
# 将数据按照\t进行切分,使每一条数据形成一个元组
split_rdd = file_rdd.map(lambda line: line.split('\t'))
# split_rdd会被多次使用,因此需要对其进行优化,如缓存后者CheckPoint都可以
split_rdd.persist(StorageLevel.DISK_ONLY)
# TODO:需求1,用于搜索关键词分析
# 将所有的搜索内容取出
context_rdd = split_rdd.map(lambda x: x[2])
# 对搜索内存进行分词处理
def context_jieba(data):
"""通过jieba分词工具进行分词操作"""
seg = jieba.cut_for_search(data)
l = list()
for word in seg:
l.append(word)
return l
words_rdd = context_rdd.flatMap(context_jieba)
final_words_rdd = words_rdd.map(lambda x: (x, 1))
# 进行单词的计数、分组、排序
result = final_words_rdd.reduceByKey(lambda a, b: a + b).sortBy(lambda x: x[1], ascending=False, numPartitions=1)
print("需求1结果:", result.collect())
# TODO: 需求2:用户和关键词组合分区
# 提取出来用户的ID和搜索内容(用户ID和搜索内容)
user_content_rdd = split_rdd.map(lambda x: (x[1], x[2]))
# 对用户的搜索内容进行分词,分词后和用户ID进行组合
def extract_user_and_word(data):
"""传入数据,返回(ID,分词结果)"""
user_id = data[0]
content = data[1]
# 对内容content进行分词处理
words = context_jieba(content)
return_list = list()
for word in words:
# 对用户ID进行组合
return_list.append((user_id + "_" + word, 1))
return return_list
user_word_rdd = user_content_rdd.flatMap(extract_user_and_word)
# 分组聚合排序
result2 = user_word_rdd.reduceByKey(lambda a, b: a + b).sortBy(lambda x: x[1], ascending=False, numPartitions=1).take(5)
print("需求2结果:", result2)
# TODO:需求3:热门搜索时间段分析
# 取出来数据中的时间
time_rdd = split_rdd.map(lambda x: x[0])
# 对时间进行处理,只保留小数精度
hour_with_rdd = time_rdd.map(lambda x: (x.split(":")[0], 1))
# 单词技术逻辑
result3 = hour_with_rdd.reduceByKey(add).sortBy(lambda x: x[1], ascending=False, numPartitions=1)
print("需求3结果:", result3.collect())
PySpark学习笔记—案例学习
最新推荐文章于 2024-07-11 17:26:33 发布