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

相关推荐
大大大大晴天3 天前
Hudi Metadata Table 与 Hive Sync (HMS)怎么选?
大数据
手可摘星辰7773 天前
一次线上FlinkCDC异常排查复盘
大数据·flink
大大大大晴天3 天前
Hudi技术内幕:Metadata Table原理与实践
大数据
大大大大晴天4 天前
Hudi技术内幕:深入解析Index索引机制
大数据
阿里云大数据AI技术4 天前
Flink Forward Asia 2026 深圳启幕:Agentic Streaming for AI,开启实时智能新范式
大数据·flink
SelectDB5 天前
阶跃星辰基于 SelectDB 构建 PB 级 Agent 可观测平台
大数据·数据库·aigc
大大大大晴天8 天前
Hudi技术内幕:RecordPayload到RecordMerger
大数据
SelectDB9 天前
秒级弹性、最高降本 70%:SelectDB Serverless 如何重塑云数仓资源效率
大数据·后端·云原生
WhoAmI9 天前
MapReduce框架原理解析一:InputFormat
大数据·hadoop
WhoAmI9 天前
MapReduce框架原理解析三:OutputFormat
大数据·hadoop