SparkSQL案例-图书信息分析
SparkSQL案例-图书信息分析
- 实验环境
- 数据集介绍
- 问题描述
- 实验步骤
- 0. 准备工作
- 1. 观察数据
- 1) 创建SparkSession
- 2) 读取文件并观察数据
- 2. 将DataFrame注册为View
- 3. 查询书名包含“程序”的书
- 4. 查询评分大于9的图书
- 5. 统计各个出版社的图书量
- 6. 可视化出版社的图书量Top10
- 1)解决中文显示问题
- 2) 可视化
- 7. 统计各出版社所出版书籍的平均评分
- 1)按要求统计平均分
- 2) 可视化top10
- 相关资源
SparkSQL是Spark为处理结构化数据提供的高级组件,本文将使用SparkSQL完成图书信息统计,示例代码将分别以DSL和SQL两种风格进行讲解,并结合Matplotlib和Pandas对结果进行可视化呈现。
文末提供数据和源代码的网盘资源。
实验环境
- ubuntu1804
- pyspark2.4.7
- JupyterLab
- Anconda3
实验环境可参考:https://blog.csdn.net/tangyi2008/article/details/123109198
JupyterLab使用可参考:https://blog.csdn.net/tangyi2008/article/details/123761210
数据集介绍
数据文件 books.txt
数据片段
序号,书名,评分,价格,出版社,url 5173,動力取向精神醫學--臨床應用與實務,10.0 ,1200元,心灵工坊,https://book.douban.com/subject/6053667/ 9929,水彩绘森活,10.0 ,29.8,人民邮电出版社,https://book.douban.com/subject/26115807/ 10124,殷周金文集成(修订增补本共8册)(精),10.0 ,2400.00元,中华书局,https://book.douban.com/subject/2235855/ 16628,纸雕游戏大书,10.0 ,99.00元,重庆出版集团,https://book.douban.com/subject/26673804/ 19103,Michelangelo,10.0 ,$200.00 ,Taschen,https://book.douban.com/subject/2342660/ 20063,一支笔的快乐涂鸦2,10.0 ,29.8,人民邮电出版社,https://book.douban.com/subject/26280062/ ...
- 数据包含6个字段,每个字段用逗号
,
分隔,是一个标准的CSV文件 - 数据中包含中文字符,读取时要考虑文件的编码
- 数据第一行为中文的字段名
- 数据包含6个字段,每个字段用逗号
问题描述
- 查询书名包含“程序”的书
- 统计其数量
- 查询评分大于9的图书
- 统计各个出版社的图书量
- 要求按从大到小的顺序排序
- 可视化出版社的图书量Top10
- 统计各出版社所出版书籍的平均评分
- 只统计评论数在200以上的出版社
- 按平均分从高到低排序
- 可视化平均评分Top10
实验步骤
0. 准备工作
在home目录下创建目录book
mkdir ~/book
将数据文件上传至目录
~/book
使用如下shell命令查看文件编码
file ~/book/book.txt
可看到如下内容,可知文件编码为UTF-8
book.txt: UTF-8 Unicode text, with CRLF line terminators
也可以用vim打开文件
vim book.txt
,在命令行模式下输入:set fileencoding
查看编码启动JupyterLab
cd ~/book jupyter lab
在JupyterLab中新建Notebook
1. 观察数据
1) 创建SparkSession
from pyspark.sql import SparkSession
spark = SparkSession.builder.master('local').appName('sparksql-book').getOrCreate()
2) 读取文件并观察数据
从刚才的文件片段可知,要读取该文件,可以指定DataFrame Reader的读取格式为csv
;其次,字段名都为中文,不方便写代码所以在导入数据时指定了schema信息。
- schema由许多字段构成的 StructType,这些字段即为 StructField,它具有名称、类型、布尔标志(该标志指定该列是否可以包含缺失值或空值),并且用户可指定与该列关联的元数据(metadata)。
from pyspark.sql.types import *
schema = StructType([StructField('id', StringType(), False),StructField('name', StringType(), True),StructField('rate', FloatType(), True),StructField('price', StringType(), True),StructField('publish', StringType(), True),StructField('url', StringType(), True),
])
books = spark.read.csv('file:///home/xiaobai/book/book.txt', header=True, schema=schema)
books.show()
+-----+-----------------------------------+----+---------+------------------+--------------------+
| id| name|rate| price| publish| url|
+-----+-----------------------------------+----+---------+------------------+--------------------+
| 5173| 動力取向精神醫學--臨床應用與實務|10.0| 1200元| 心灵工坊|https://book.doub...|
| 9929| 水彩绘森活|10.0| 29.8| 人民邮电出版社|https://book.doub...|
|10124| 殷周金文集成(修订增补本共8册)(精)|10.0|2400.00元| 中华书局|https://book.doub...|
|16628| 纸雕游戏大书|10.0| 99.00元| 重庆出版集团|https://book.doub...|
|19103| Michelangelo|10.0| $200.00 | Taschen|https://book.doub...|
|20063| 一支笔的快乐涂鸦2|10.0| 29.8| 人民邮电出版社|https://book.doub...|
|32781| 亲亲宝贝装|10.0| 28.00元|江西科学技术出版社|https://book.doub...|
|32879| Photoshop7解像|10.0| 68.00元| 海洋出版社|https://book.doub...|
|45687| 戚蓼生序本石头记|10.0| 350.00元| 人民文学出版社|https://book.doub...|
|52504| 宇宙兄弟(7)|10.0| JPY580| 講談社|https://book.doub...|
|52505| 宇宙兄弟(8)|10.0| JPY580| 講談社|https://book.doub...|
| 573| TCP\IP详解(卷1英文版)| 9.9| 45| 机械工业出版社|https://book.doub...|
| 589|计算机程序设计艺术卷1:基本算法(...| 9.9| 119.00元| 人民邮电出版社|https://book.doub...|
| 5522| 微积分和数学分析引论-第1卷| 9.9| 79.00元| 世界图书出版公司|https://book.doub...|
| 5547| PrinciplesofNeura...| 9.9| $103.41 |McGraw-HillMedical|https://book.doub...|
| 7443| 奈特人体神经解剖彩色图谱| 9.9| 138.00元| 人民卫生出版社|https://book.doub...|
| 8703| 数学、科学和认识论| 9.9| 32.00元| 商务印书馆|https://book.doub...|
| 9924| 零基础学素描| 9.9| 20元| 人民邮电出版社|https://book.doub...|
| 9926| 黑白花意3:300例超写实的花之绘| 9.9| 29.80元| 人民邮电出版社|https://book.doub...|
| 9927| 黑白画意:经典植物手绘教程| 9.9| 29.80元| 人民邮电出版社|https://book.doub...|
+-----+-----------------------------------+----+---------+------------------+--------------------+
only showing top 20 rows
- 查看下books的类型:
type(books)
- 通过RDD的方式查看前5个元素:
books.take(5)
- 查看books的元信息:
books.schema
2. 将DataFrame注册为View
SparkSQL提供了两种操作方式
- DSL
- SQL
本案例将分别使用两种方式演示,为了使用SQL方式,需要先将对应的DataFrame注册为View
books.createOrReplaceTempView('books')
过时的方式为
registerTempTable
,在Spark2.0后弃用DataFrame提供了四种方式注册为View,
df.createTempView
df.createOrReplaceTempView
df.createGlobalTempView
df.createOrReplaceGlobalTempView
上面四种方法的区别与联系:
从使用范围方面,可分为带global和不带两种,其中带global是当前spark application中可用,不带时只能被当前spark session使用
从创建的角度看,可分为带replace和不带两种,当创建视图时,如果目标视图已经存在,带replace的函数会覆盖掉原来的,否则将报错
3. 查询书名包含“程序”的书
DSL
查看包含“程序”的书
books.filter('name LIKE "%程序%" ').show()
+----+------------------------------------+----+--------+--------------+--------------------+ | id| name|rate| price| publish| url| +----+------------------------------------+----+--------+--------------+--------------------+ | 589| 计算机程序设计艺术卷1:基本算法(...| 9.9|119.00元|人民邮电出版社|https://book.doub...| | 343| 计算机程序设计艺术(第3卷)| 9.8| 98.00元|国防工业出版社|https://book.doub...| | 173|计算机程序设计艺术第2卷半数值算法...| 9.7| 83|清华大学出版社|https://book.doub...| | 198| C程序设计语言| 9.7| 23.00元|清华大学出版社|https://book.doub...| | 634| C程序设计语言| 9.7| 35.00元|机械工业出版社|https://book.doub...| | 342| 计算机程序设计艺术| 9.6| 45.00元|机械工业出版社|https://book.doub...| | 10| 计算机程序的构造和解释| 9.5| 45.00元|机械工业出版社|https://book.doub...| | 328| C++程序设计语言(特别版)(英文...| 9.5| 55|高等教育出版社|https://book.doub...| | 344| 计算机程序设计艺术(第1卷)| 9.5| 98.00元|国防工业出版社|https://book.doub...| | 25| C程序设计语言| 9.4| 30.00元|机械工业出版社|https://book.doub...| | 175| 计算机程序设计艺术(第2卷)| 9.4| 98.00元|国防工业出版社|https://book.doub...| | 556| 深入Linux设备驱动程序内核机制| 9.4| 98.00元|电子工业出版社|https://book.doub...| | 83| 计算机程序设计艺术(第1卷)| 9.3| 80.00元|清华大学出版社|https://book.doub...| | 282| JavaScript高级程序设计(...| 9.3| 99.00元|人民邮电出版社|https://book.doub...| | 538| JavaScript高级程序设计:第2版| 9.3| 89.00元|人民邮电出版社|https://book.doub...| | 307| 程序设计实践| 9.2| 22|机械工业出版社|https://book.doub...| |1025| Windows程序设计| 9.2|129.00元|北京大学出版社|https://book.doub...| |1090| 程序设计实践| 9.2| 59.00元|机械工业出版社|https://book.doub...| |2927| C语言程序设计| 9.2| 79.00元|人民邮电出版社|https://book.doub...| | 36| 程序设计实践| 9.1| 20.00元|机械工业出版社|https://book.doub...| +----+------------------------------------+----+--------+--------------+--------------------+ only showing top 20 rows
统计其数量
books.filter('name LIKE "%程序%" ').count()
104
SQL
查看包含“程序”的书
spark.sql('select * from books where name LIKE "%程序%"').show()
统计其数量
spark.sql('select count(*) from books where name LIKE "%程序%"').show()
show(n=20, truncate=True, vertical=False)
默认打印前20条数,可传参控制输出行数、内容是否截断以及打印方式
4. 查询评分大于9的图书
DSL
from pyspark.sql.functions import col books.filter(col('rate') > 9).show()
+-----+-----------------------------------+----+---------+------------------+--------------------+ | id| name|rate| price| publish| url| +-----+-----------------------------------+----+---------+------------------+--------------------+ | 5173| 動力取向精神醫學--臨床應用與實務|10.0| 1200元| 心灵工坊|https://book.doub...| | 9929| 水彩绘森活|10.0| 29.8| 人民邮电出版社|https://book.doub...| |10124| 殷周金文集成(修订增补本共8册)(精)|10.0|2400.00元| 中华书局|https://book.doub...| |16628| 纸雕游戏大书|10.0| 99.00元| 重庆出版集团|https://book.doub...| |19103| Michelangelo|10.0| $200.00 | Taschen|https://book.doub...| |20063| 一支笔的快乐涂鸦2|10.0| 29.8| 人民邮电出版社|https://book.doub...| |32781| 亲亲宝贝装|10.0| 28.00元|江西科学技术出版社|https://book.doub...| |32879| Photoshop7解像|10.0| 68.00元| 海洋出版社|https://book.doub...| |45687| 戚蓼生序本石头记|10.0| 350.00元| 人民文学出版社|https://book.doub...| |52504| 宇宙兄弟(7)|10.0| JPY580| 講談社|https://book.doub...| |52505| 宇宙兄弟(8)|10.0| JPY580| 講談社|https://book.doub...| | 573| TCP\IP详解(卷1英文版)| 9.9| 45| 机械工业出版社|https://book.doub...| | 589|计算机程序设计艺术卷1:基本算法(...| 9.9| 119.00元| 人民邮电出版社|https://book.doub...| | 5522| 微积分和数学分析引论-第1卷| 9.9| 79.00元| 世界图书出版公司|https://book.doub...| | 5547| PrinciplesofNeura...| 9.9| $103.41 |McGraw-HillMedical|https://book.doub...| | 7443| 奈特人体神经解剖彩色图谱| 9.9| 138.00元| 人民卫生出版社|https://book.doub...| | 8703| 数学、科学和认识论| 9.9| 32.00元| 商务印书馆|https://book.doub...| | 9924| 零基础学素描| 9.9| 20元| 人民邮电出版社|https://book.doub...| | 9926| 黑白花意3:300例超写实的花之绘| 9.9| 29.80元| 人民邮电出版社|https://book.doub...| | 9927| 黑白画意:经典植物手绘教程| 9.9| 29.80元| 人民邮电出版社|https://book.doub...| +-----+-----------------------------------+----+---------+------------------+--------------------+ only showing top 20 rows
表示列
rate
的方式有多种col('rate')
#需要导入col函数books.rate
#这种写法要注意列名要不与方法名重名,比如有一列叫count
,当你使用books.count
表示列时就会报错,因为它表示的是一个方法books['rate']
SQL
spark.sql('select * from books where rate > 9').show()
5. 统计各个出版社的图书量
DSL
books.groupby('publish').count().sort(col('count').desc()).show()
或者
books.groupby('publish').count().sort('count', ascending=False).show()
+----------------------+-----+ | publish|count| +----------------------+-----+ | 人民文学出版社| 1437| | 上海译文出版社| 1426| | 中华书局| 1278| | 东立出版社| 1223| |生活·读书·新知三联书店| 1105| | 北京大学出版社| 948| | 译林出版社| 934| | 商务印书馆| 917| | 上海人民出版社| 829| | 广西师范大学出版社| 726| | 中国人民大学出版社| 641| | 人民邮电出版社| 599| | 上海古籍出版社| 590| | 南海出版公司| 575| | 尖端出版社| 557| | 中信出版社| 537| | 机械工业出版社| 519| | 新星出版社| 511| | 集英社| 465| | 講談社| 426| +----------------------+-----+ only showing top 20 rows
SQL
spark.sql('select publish, count(1) as count from books group by publish order by count desc' ).show()
6. 可视化出版社的图书量Top10
1)解决中文显示问题
如果不在乎中文显示乱码或者嫌麻烦,跳过此步骤
(1)下载字体SimHei.ttf
在ubuntu系统,可能缺乏相应字体,需要自行下载
下载方式可以自行百度,或者在文末的网盘链接下载
(2)将字体上传到matplotlib的字体目录
使用下面的代码查看matplotlib的目录
import matplotlib
print(matplotlib.matplotlib_fname())
显示结果示例:
'/home/xiaobai/opt/anaconda3/lib/python3.6/site-packages/matplotlib/mpl-data/matplotlibrc'
将下载的SimHei.ttf上传至上面代码输出目录的子目录fonts/ttf
示例目录
/home/xiaobai/opt/anaconda3/lib/python3.6/site-packages/matplotlib/mpl-data/fonts/ttf
注意,实际目录以代码运行结果为准
(3)清空matplotlib缓存
rm -rf ~/.cache/matplotlib
2) 可视化
import matplotlib.pyplot as pltplt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号df = books.groupby('publish').count().sort('count', ascending=False).toPandas()
df.iloc[10::-1].set_index('publish').plot.barh()
7. 统计各出版社所出版书籍的平均评分
具体要求如下:
- 只统计评论数在200以上的出版社
- 按平均分从高到低排序
- 可视化平均评分Top10
1)按要求统计平均分
DSL
from pyspark.sql import functions as F #按出版社进行分组,并分别统计数量和评分的平均分 pub_cnt_rate = books.groupby('publish').agg(F.count(F.col('id')).alias('count'), F.mean(F.col('rate')).alias('avg_rate')) #筛选评论数大于200的数据,并按降序排列 top_avg = pub_cnt_rate.filter(F.col('count')>200).sort('avg_rate', ascending = False) #显示数据 top_avg.show()
+------------------+-----+-----------------+ | publish|count| avg_rate| +------------------+-----+-----------------+ | 集英社| 465|9.001505358501147| |中国少年儿童出版社| 207|8.999033773578883| | 講談社| 426|8.939671380978794| | 东立出版社| 1223|8.926819284334597| | 小学館| 253|8.866007923608713| | 尖端出版社| 557| 8.78402155562834| | 台灣角川| 267|8.656554338190887| | 上海古籍出版社| 590|8.648813579042079| | 中华书局| 1278|8.647104871478252| | 世界图书出版公司| 269|8.635687769567213| | 接力出版社| 219| 8.63196347510978| | 人民邮电出版社| 599| 8.62036727465851| | 二十一世纪出版社| 323| 8.60743037539739| | 時報文化| 215|8.576279125657193| |中国建筑工业出版社| 209|8.540191401705217| |北京十月文艺出版社| 230|8.536086980156277| | 人民文学出版社| 1437|8.530897729498028| | 河北教育出版社| 385|8.528571470681722| | 商务印书馆| 917|8.522464596198196| | 机械工业出版社| 519|8.521194627059907| +------------------+-----+-----------------+ only showing top 20 rows
SQL
top_avg = spark.sql(''' select * from (select publish, count(1) as count, avg(rate) as avg_rate from books group by publish) where count > 200 order by avg_rate desc ''') top_avg.show()
2) 可视化top10
import matplotlib.pyplot as pltplt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号df = top_avg.toPandas()
df.iloc[10::-1, [0,2]].set_index('publish').plot.barh(legend=False,xlim = (8,10))
相关资源
链接:https://pan.baidu.com/s/15dm0Y-H1JQE0TcvWC4kL0w?pwd=dvzj
提取码:dvzj
SparkSQL案例-图书信息分析相关推荐
- Python Scrapy爬虫实战(1):豆瓣网站图书信息案例- Scrapy初体验
Scrapy,Python开发的一个快速.高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据.Scrapy用途广泛,可以用于数据挖掘.监测和自动化测试.Scrapy吸引人的 ...
- Python数据分析入门笔记10——简单案例练习(学生信息分析)
系列文章目录 Python数据分析入门笔记1--学习前的准备 Python数据分析入门笔记2--pandas数据读取 Python数据分析入门笔记3--数据预处理之缺失值 Python数据分析入门笔记 ...
- 【PySpark】流处理案例实战:分析纽约市出租车载客信息
Spark 两个用于流处理的组件--Spark Streaming 和 Structured Streaming.其中 Spark Streaming 是 Spark 2.0 版本前的的流处理库,在 ...
- Python自学笔记5:实操案例二(输出出版图书信息、《红楼梦》五位人名、图书音像勋章、身体指标)
Python自学笔记4:实操案例二(输出出版图书信息.<红楼梦>五位人名.图书音像勋章.身体指标) 1.输出出版图书信息 这个没啥难度,就是定义变量然后输出,注意调整格式就行 book_n ...
- Django案例:显示图书信息
文章目录 一.提出任务 二.实现步骤 (一)创建Django项目 - books (二)创建并注册应用 - index 1.创建index应用 2.注册index应用 (三)创建数据库 - books ...
- 通过豆瓣Api,输入ISBN获取图书信息
在本篇文章中,主要是通过豆瓣API实现获取图书信息的小功能. 一. 豆瓣API能干什么? 参考链接:[url]http://www.douban.com/service/ [/url] 豆瓣API ...
- c语言用价格统计图书信息,C语言图书信息管理系统代码.doc
课 程 报 告 课 程 名 称: 程序设计实践 专 业 班 级 : 计算机类1504 学 生 姓 名 : 学 号 : 任 课 教 师 : 许伟涛 学 期 :2015-2016学年第二学期 课程报告任务 ...
- 2021年大数据Spark(二十一):Spark Core案例-SogouQ日志分析
目录 案例-SogouQ日志分析 业务需求 准备工作 HanLP 中文分词 样例类 SogouRecord 业务实现 搜索关键词统计 用户搜索点击统计 搜索时 ...
- [源码和文档分享]基于VC++控制台实现的图书信息管理系统
1 需求分析 开发一个图书信息管理系统,图书信息包括:图书编号.书名.作者.出版社.类别.出版时间.价格等基本信息(也可以根据自己情况进行扩充,比如是否借出.库存量等).使之能提供以下基本功能: 图书 ...
- JavaWeb-综合案例(用户信息)-学习笔记06【复杂条件查询功能】
Java后端 学习路线 笔记汇总表[黑马程序员] JavaWeb-综合案例(用户信息)-学习笔记01[列表查询] JavaWeb-综合案例(用户信息)-学习笔记02[登录功能] JavaWeb-综合案 ...
最新文章
- 转:【小作品】STM32无线WIFI视频小车制作剖析(下)
- kerberos 身份认证 简介
- secureCrt个人操作手册
- C++中transform的用法
- 极光推送收费标准_刚刚,安卓统一推送又有进展了!华为率先...
- oj系统格式错误_论文查重会不会检查格式?【paperpp吧】
- Qt之QParallelAnimationGroup
- 特斯拉已撤回德国电池工厂建厂补贴申请 原有望获得近13亿美元
- python代码中怎么增加数据_python 实现数据库中数据添加、查询与更新的示例代码...
- android 溢出按钮,React-Native封裝Tabbar 實現中間按鈕溢出效果(Android/iOS)
- redis报错: redis.exceptions.ResponseError: value is not an integer or out of range
- android连接打印机打印pdf文件,如何在Android设备上打印PDF文件
- es6 7 8 9 10特性归纳
- 常见的分布期望及其方差
- “茄汁Ketchup”一词从汉语到英语的文化旅游
- Java 网络编程:(七)UDP网络编程
- android实时投屏软件下载,安卓投屏助手
- Android 如何在关于手机界面添加个图片
- mybatis动态SQL多条件查询1 - if 标签
- KNN分类——matlab(转载)