当前位置: 首页 > news >正文

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

目录

题目

准备数据 

 分析数据

实现数据

总结


题目

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

准备数据 

将数据上传到hdfs上

 分析数据

读取数据

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

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

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

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

# 计算不同分类的问题数量
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中的数据分词

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

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

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

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

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

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

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

5-对键值对进行聚合

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

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

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

实现数据

第一种:一步一步分开写

from pyspark import SparkContext
import json
import jiebasc = 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))

第二种:通过链式操作

from pyspark import SparkContext
import json
import jiebasc = 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(),只查看前几条


http://www.mrgr.cn/news/47473.html

相关文章:

  • 从0到机器视觉工程师(六):配置OpenCV和Qt环境
  • 【redis】ubuntu18安装redis7
  • linux截取日志信息
  • VUE + pdfh5 实现pdf 预览,主要用来uniappH5实现嵌套预览PDF
  • Mysql--架构篇--体系结构(连接层,SQL层,存储引擎层,文件存储层)
  • QT c++ 自定义按钮类 加载图片 美化按钮
  • QFileIconProvider Class
  • linux:使用sar诊断问题
  • Python自动给课本文字标注拼音
  • vscode配置
  • QFileDialog Class
  • yq 工具
  • 前端笔记(一):父传子,子传父,获取DOM对象或组件,别名路径联想设置,elemntPlus
  • Hadoop再探讨
  • BERT模型学习笔记
  • 关于贝叶斯分类器的一份介绍
  • CANoe_调用C#控件的方法_DEMO方法演示
  • Python类基本知识
  • 联软安全助手卸载 UniAccess Agent,最简单的方法,两步解决!!!
  • C语言从头学67——学习头文件stddef.h和stdbool.h
  • 挑战高薪职位--全面掌握Oracle数据库:从入门到实战高薪技能(11g至19c)
  • 10.10今日错题解析(软考)
  • 爸妈总说着学门技术,学机器视觉技术确实是一条踏实的生活道路,这条路你走得下去走得通吗?
  • ubuntu 18.04虚拟机以太网网段与地平线J6板端连接配置
  • 排序算法——归并排序
  • Lumerical——光源(Sources)