Spark练习json文件-统计问答数据

目录

题目

准备数据

分析数据

实现数据

总结


题目

  1. 计算不同分类的问题数量
  2. 统计问题中的热搜词,并获取top10的热搜词

准备数据

将数据上传到hdfs上

分析数据

读取数据

python 复制代码
from pyspark import SparkContext
import json
import jieba

sc = SparkContext()

# 读取hdfs数据
rdd = sc.textFile('hdfs://node1:8020/data/baike_qa_valid.json')

对每行的json字符串转换为字典

python 复制代码
# 对每行的json字符串转为字典
rdd_dict = rdd.map(lambda x:json.loads(x))
print(rdd_dict.take(1))

第一问:计算不同分类的问题数量

python 复制代码
# 计算不同分类的问题数量
rdd_kv = rdd_dict.map(lambda x:(x['category'],1)).reduceByKey(lambda x,y:x+y)

res3 = rdd_kv.collect()
print(res3)

第二问:统计问题中的热搜词,并获取top10的热搜词

1-对title中的数据分词

python 复制代码
# # 1-对title中的数据分词
rdd_cut = rdd_dict.map(lambda x:list(jieba.cut(x['title'])))
print(rdd_cut.take(10))

2-将这些数据合并成一个单一的序列

python 复制代码
# # 2-将这些数据合并成一个单一的序列
rdd_flatmap = rdd_cut.flatMap(lambda x:x)
print(rdd_flatmap.take(20))

3-只保留长度大于1的单词

python 复制代码
# # # 3-筛选条件,只保留长度大于1的单词
rdd_filter = rdd_flatmap.filter(lambda x:len(x)>1)
print(rdd_filter.take(10))

4-将每个单词转换成键值对

python 复制代码
# # 4-将每个单词转换成键值对
rdd_map = rdd_filter.map(lambda x:(x,1))
print(rdd_map.take(10))

5-对键值对进行聚合

python 复制代码
# # 5-对键值对进行聚合
rdd_reduce = rdd_map.reduceByKey(lambda x,y:x+y)
print(rdd_reduce.take(10))

6-对最后的数据进行排名,取出top10

python 复制代码
# # 6-对数据进行排序
rdd_sort = rdd_reduce.sortBy(lambda x:x[1],ascending=False)
print(rdd_sort.take(10))

实现数据

第一种:一步一步分开写

python 复制代码
from pyspark import SparkContext
import json
import jieba

sc = SparkContext()

# 读取hdfs数据
rdd = sc.textFile('hdfs://node1:8020/data/baike_qa_valid.json')

# 对每行的json字符串转为字典
rdd_dict = rdd.map(lambda x:json.loads(x))

# 计算不同分类的问题数量
rdd_kv = rdd_dict.map(lambda x:(x['category'],1)).reduceByKey(lambda x,y:x+y)


# # 对title中的数据分词
# # 1-对title中的数据分词
rdd_cut = rdd_dict.map(lambda x:list(jieba.cut(x['title'])))
# print(rdd_cut.take(10))
# # 2-将这些数据合并成一个单一的序列
rdd_flatmap = rdd_cut.flatMap(lambda x:x)
# print(rdd_flatmap.take(20))
# # # 3-筛选条件,只保留长度大于1的单词
rdd_filter = rdd_flatmap.filter(lambda x:len(x)>1)
# print(rdd_filter.take(10))
# # 4-将每个单词转换成键值对
rdd_map = rdd_filter.map(lambda x:(x,1))
# print(rdd_map.take(10))
# # 5-对键值对进行聚合
rdd_reduce = rdd_map.reduceByKey(lambda x,y:x+y)
# print(rdd_reduce.take(10))
# # 6-对数据进行排序
rdd_sort = rdd_reduce.sortBy(lambda x:x[1],ascending=False)
print(rdd_sort.take(10))

第二种:通过链式操作

python 复制代码
from pyspark import SparkContext
import json
import jieba

sc = SparkContext()

# 读取hdfs数据
rdd = sc.textFile('hdfs://node1:8020/data/baike_qa_valid.json')

# 对每行的json字符串转为字典
rdd_dict = rdd.map(lambda x:json.loads(x))

# 计算不同分类的问题数量
rdd_kv = rdd_dict.map(lambda x:(x['category'],1)).reduceByKey(lambda x,y:x+y)


# 统计问题中的热搜词,并获取的热搜词
# 对title中的数据分词
rdd_jieba = (rdd_dict.
             map(lambda x:list(jieba.cut(x['title']))).
             flatMap(lambda x:x).
             filter(lambda x:len(x)>1).
             map(lambda x:(x,1)).
             reduceByKey(lambda x,y:x+y).
             sortBy(lambda x:x[1],ascending=False))
#
# # 查看读取的数据

res3 = rdd_kv.collect()
print(res3)

res4 = rdd_jieba.take(10)
print(res4)

总结

因为数据量过大,所以使用collect()将会出现下面错误,可以使用take(),只查看前几条

相关推荐
samLi06204 小时前
【数据集】水星逆行及相关日期窗口数据(1973-2025年)
大数据
updayday8544 小时前
客户附件不该发往旧邮箱,如何在发送前拦截 - Ping64 邮件安全管控
大数据·网络·数据库·安全·智能路由器
注塑机数据采集联网4 小时前
数据采集网关入门:ZK-D1/D3从零开始构建你的数据运用
大数据·数据仓库·人工智能·物联网·数据库架构·注塑机网关
演艺大赏4 小时前
20000 个文件跑了 11500 秒:你压的是 YARN 调度器,不是 HDFS
大数据
wtblszn5 小时前
农村供水站远程监控智能管理方案
大数据
aixingkong9217 小时前
华为灵衢超节点参考架构白皮书深度解读
大数据·人工智能·华为
大大大大晴天7 小时前
每天认识一个组件:Apache Iceberg
大数据
一条泥憨鱼8 小时前
【Kafka】零基础学习教程
java·分布式·学习·kafka
xiaoyunxuexibiji8 小时前
采购协同管理:从备货计划、进度确认到到货签收
大数据·运维·人工智能