PySpark学习---RDD应用之搜索引擎日志分析案例

12 篇文章 0 订阅
10 篇文章 1 订阅

数据格式:

 需求:

安装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)

运行结果:

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值