使用Spark RDD算子实现经典实战案例: 热门中文热词频Top10统计 数据分析案例

  • 学习:知识的初次邂逅
  • 复习:知识的温故知新
  • 练习:知识的实践应用

目录

一,需求

二,思路

三,代码实现


一,需求

本文案例的资源,可直接下载

https://download.csdn.net/download/qq_55006020/89864064?spm=1001.2014.3001.5501

案例要求:  要求:统计出title中 热门词频Top10

有这么有一份数据文件 46.2MB

打开之后:

要求:统计出title中 热门词频Top10

实现技术栈:

实现这道题的需求,可以用的工具选择有很多,用sql,用hive,用pandas等都可以实现;

这里用spark中的RDD算子分析;


二,思路

  • 第一步:导入数据
  • 第二步:把数据转为字典
  • 第三步:根据字典键取值,拿到title
  • 第四步:使用jieba分词,过滤掉形容词,保留名词
  • 第五步:多维列表拉平至一维列表;
  • 第六步:过滤单词长度小于1的;  
  • 第七步:单词计数,转为kv结构,给每个单词后面计数为1
  • 第八步:reduce规约,统计单词次数
  • 第九步:排序,以单词出现的次数降序排序
  • 第十步:输出前Top10的单词以及出现的次数

完整代码

# encoding=utf-8

import json
from pyspark import SparkContext
import jieba.posseg as pseg

sc = SparkContext()
#第一步,导入数据
rdd = sc.textFile('hdfs://node1:8020/baike_qa_valid.json')
# print(rdd.take(10))
#第二步,转json为字典
rdd_dict = rdd.map(lambda x:json.loads(x))
# print(rdd_dict.take(10))
#第三步,遍历每一行,根据键取值
rdd_title = rdd_dict.map(lambda x:x['title'])
# print(rdd_title.take(10))
# 过滤名词
def minci(title):
    words = pseg.cut(title)  #全部的分词
    nouns = []
    for word, flag in words:
        if flag.startswith('n'):  #如果是名词就放进去
            nouns.append(word)
    return nouns

#第四步 运用叽霸分词 把词分出来  我只保留名词哦~~
rdd_word = rdd_title.map(lambda x:minci(x))
# print(rdd_word.take(10))

#第五步 拉平列表
rdd_word1 = rdd_word.flatMap(lambda x:x)
# print(rdd_word1.collect(),'查看分词的结果')
#第六步 过滤单词长度小于1的,
rdd_fiflt = rdd_word1.filter(lambda x:len(x)>1)
# print(rdd_fiflt.collect())
#第七步:单词计数 转为kv结构
rdd_tuple = rdd_fiflt.map(lambda x:(x,1))
# print(rdd_tuple.collect())
#第八步,分组聚合
rdd_group = rdd_tuple.reduceByKey(lambda x,y:x+y)
# print(rdd_group.collect())
#第九步,排序 降序
rdd_sort = rdd_group.sortBy(lambda x:x[1],ascending=False)
# print(rdd_sort.collect())


# print(rdd.take(10))
# print(rdd_dict.collect())
# print(rdd_title.take(5))
print(rdd_sort.take(10))
'''
但是统计出来的 都是一些形容词 没啥意义  所以需要保留名词
'''
#[('什么', 7555), ('怎么', 4546), ('问题', 3090),
# ('请问', 2982), ('为什么', 2563), ('一个', 2492),
# ('可以', 2355), ('如何', 2331), ('现在', 2201), ('知道', 1993)]
'''
这是保留名词之后结果
[('问题', 3090), ('大家', 1243),
 ('宝宝', 1231), ('时候', 1224),
  ('电脑', 1184), ('谢谢', 1106), 
  ('游戏', 896), ('高手', 780), ('朋友', 740), ('老师', 615)]
'''

三,代码实现以及实时展示过程

第一步:导入数据

#第一步,导入数据
rdd = sc.textFile('hdfs://node1:8020/baike_qa_valid.json')
  • 验证是否导入成功

第二步:把数据转为字典

#第二步,转json为字典
rdd_dict = rdd.map(lambda x:json.loads(x))

验证是否转入成功
 

第三步:根据字典键取值,拿到title

#第三步,遍历每一行,根据键取值
rdd_title = rdd_dict.map(lambda x:x['title'])

 抽样前10条 验证查看

第四步:使用jieba分词,过滤掉形容词,保留名词

def minci(title):
    words = pseg.cut(title)  #全部的分词
    nouns = []
    for word, flag in words:
        if flag.startswith('n'):  #如果是名词就放进去
            nouns.append(word)
    return nouns

#第四步 运用叽霸分词 把词分出来  我只保留名词哦~~
rdd_word = rdd_title.map(lambda x:minci(x))
print(rdd_word.take(10))

第五步:多维列表拉平至一维列表;

#第五步 拉平列表
rdd_word1 = rdd_word.flatMap(lambda x:x)
print(rdd_word1.collect(),'查看分词的结果')

第六步:过滤单词长度小于1的;  

#第六步 过滤单词长度小于1的,
rdd_fiflt = rdd_word1.filter(lambda x:len(x)>1)
print(rdd_fiflt.collect())

第七步:单词计数,转为kv结构,给每个单词后面计数为1

#第七步:单词计数 转为kv结构
rdd_tuple = rdd_fiflt.map(lambda x:(x,1))
print(rdd_tuple)

 

第八步:reduce规约,统计单词次数

#第八步,分组聚合
rdd_group = rdd_tuple.reduceByKey(lambda x,y:x+y)
print(rdd_group.collect())

 

第九步:排序,以单词出现的次数降序排序

#第九步,排序 降序
rdd_sort = rdd_group.sortBy(lambda x:x[1],ascending=False)
print(rdd_sort.collect())

 

第十步:输出前Top10的单词以及出现的次数

print(rdd_sort.take(10))

完整代码

# encoding=utf-8

import json
from pyspark import SparkContext
import jieba.posseg as pseg

sc = SparkContext()
#第一步,导入数据
rdd = sc.textFile('hdfs://node1:8020/baike_qa_valid.json')
# print(rdd.take(10))
#第二步,转json为字典
rdd_dict = rdd.map(lambda x:json.loads(x))
# print(rdd_dict.take(10))
#第三步,遍历每一行,根据键取值
rdd_title = rdd_dict.map(lambda x:x['title'])
# print(rdd_title.take(10))
# 过滤名词
def minci(title):
    words = pseg.cut(title)  #全部的分词
    nouns = []
    for word, flag in words:
        if flag.startswith('n'):  #如果是名词就放进去
            nouns.append(word)
    return nouns

#第四步 运用叽霸分词 把词分出来  我只保留名词哦~~
rdd_word = rdd_title.map(lambda x:minci(x))
# print(rdd_word.take(10))

#第五步 拉平列表
rdd_word1 = rdd_word.flatMap(lambda x:x)
# print(rdd_word1.collect(),'查看分词的结果')
#第六步 过滤单词长度小于1的,
rdd_fiflt = rdd_word1.filter(lambda x:len(x)>1)
# print(rdd_fiflt.collect())
#第七步:单词计数 转为kv结构
rdd_tuple = rdd_fiflt.map(lambda x:(x,1))
# print(rdd_tuple.collect())
#第八步,分组聚合
rdd_group = rdd_tuple.reduceByKey(lambda x,y:x+y)
# print(rdd_group.collect())
#第九步,排序 降序
rdd_sort = rdd_group.sortBy(lambda x:x[1],ascending=False)
# print(rdd_sort.collect())


# print(rdd.take(10))
# print(rdd_dict.collect())
# print(rdd_title.take(5))
print(rdd_sort.take(10))
'''
但是统计出来的 都是一些形容词 没啥意义  所以需要保留名词
'''
#[('什么', 7555), ('怎么', 4546), ('问题', 3090),
# ('请问', 2982), ('为什么', 2563), ('一个', 2492),
# ('可以', 2355), ('如何', 2331), ('现在', 2201), ('知道', 1993)]
'''
这是保留名词之后结果
[('问题', 3090), ('大家', 1243),
 ('宝宝', 1231), ('时候', 1224),
  ('电脑', 1184), ('谢谢', 1106), 
  ('游戏', 896), ('高手', 780), ('朋友', 740), ('老师', 615)]
'''

分析完毕之后,可以转出存储数据库,或者交给pandas,或者pyehcarts直接去做图

这里暂略

 谢谢观看~~~

四,总结

中文词频统计热门top10,需要注意的点

业务方面:

  • 形容词,比如什么,怎么,等等没啥意义,所以需要过滤掉
  • 单词数量小于1的,一个字的也没有什么意义,所以也需要过滤掉

技术方面:

  • 源数据是json数据,所以需要导入json模块,将其转为字典
  • 字典可以通过键取值
  • 取到的值在用分词器过滤
  • 过滤之后的数据在进一步筛选
  • 然后生成kv结构
  • 聚合并排序
  • 取top10

  • 学习:知识的初次邂逅
  • 复习:知识的温故知新
  • 练习:知识的实践应用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值