数据格式:
需求:
安装jieba分词库
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple jieba
jieba库的小demo
import jieba
if __name__ == '__main__':
content="我在山西太原很想你,你在云南大理也是这样想的吗"
result =jieba.cut(content,True)
print(list(result))
result2=jieba.cut(content,False)
print(list(result2))
#搜索引擎模式
print(",".join(jieba.cut_for_search(content)))
本地运行:
#coding:utf-8
from pyspark import SparkConf, SparkContext
from pyspark.storagelevel import StorageLevel
# from defs import *
#conding:utf-8
import jieba
def context_jieba(data):
seg=jieba.cut_for_search(data)
l=list()
for word in seg:
l.append(word)
return l
def filter_words(data):
return data not in ['谷','帮','客']
def append_word(data):
if data == '博学': data = '博学谷'
if data == '传智': data = '传智播客'
if data == '院校': data = '院校帮'
return (data,1)
def extract_user_and_word(data):
user_id=data[0]
content=data[1]
words=context_jieba(content)
return_list=list()
for word in words:
if filter_words(word):
return_list.append((user_id+"_"+append_word(word)[0],1))
return return_list
if __name__ == '__main__':
conf=SparkConf().setAppName("test").setMaster("local[*]")
sc=SparkContext(conf=conf)
file_rdd=sc.textFile("../../data/input/SogouQ.txt")
split_rdd=file_rdd.map(lambda x:x.split("\t"))
split_rdd.persist(StorageLevel.DISK_ONLY)
#print(split_rdd.takeSample(True,3))
# TODO:需求1:用户搜索的关键‘词’分析
# 主要分析热点词
# 将所有的搜索内容取出
# print(split_rdd.takeSample(True, 3))
context_rdd=split_rdd.map(lambda x:x[2])
words_rdd=context_rdd.flatMap(context_jieba)
# print(words_rdd.collect())
#异常数据清除
filtered_rdd=words_rdd.filter(filter_words)
#数据更新并加入元组
final_words_rdd=filtered_rdd.map(append_word)
# 对单词进行分组、聚合、排序 求出前五名
result1=final_words_rdd.reduceByKey(lambda a,b:a+b).sortBy(lambda x:x[1],ascending=False,numPartitions=1).take(5)
print("需求一结果:",result1)
# TODO:需求2:用户和关键词组合分析
# 1,我喜欢传智播客
# 1 + 我 1+喜欢 1+传智播客
user_content_rdd = split_rdd.map(lambda x: (x[1], x[2]))
# 对用户的搜索内容进行分词,分词后和用户ID再次组合
user_word_with_one_rdd = user_content_rdd.flatMap(extract_user_and_word)
# print(user_word_with_one_rdd.collect())
# 对内容进行分组、聚合、排序、求前5
result2 = user_word_with_one_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_one_rdd = time_rdd.map(lambda x: (x.split(":")[0], 1))
# 分组、聚合、排序
result3 = hour_with_one_rdd.reduceByKey(lambda a,b:a+b). \
sortBy(lambda x: x[1], ascending=False, numPartitions=1). \
collect()
print("需求3结果:", result3)
运行结果: