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(),只查看前几条

相关推荐
王哲晓10 分钟前
第七章 RabbitMQ之交换机
网络·分布式·rabbitmq
梦想画家15 分钟前
Dbt增量策略模型实践指南
大数据·数据治理·数据工程·分析工程
GZ8manage16 分钟前
高亚科技助力优巨新材,打造高效数字化研发项目管理平台
大数据·人工智能
萌宠心语24 分钟前
智能听诊器:宠物健康管理的革命
大数据·人工智能·科技·生活·宠物
大宇进阶之路32 分钟前
kafka和zookeeper单机部署
分布式·zookeeper·kafka
实在智能RPA2 小时前
“国货户外TOP1”凯乐石签约实在智能,RPA助力全域电商运营自动化提效
大数据·人工智能·自动化·rpa·实在智能
ShuQiHere2 小时前
【ShuQiHere】 重新定义搜索:本体搜索引擎的时代
大数据·搜索引擎
木鬼与槐2 小时前
安装Spark-单机部署,Standalone集群部署,Spark on Yarn实现
大数据·分布式·spark
辞南℡2 小时前
RabbitMQ
分布式·rabbitmq·ruby
小登ai学习3 小时前
简单认识redis - 7redis实现分布式
数据库·redis·分布式