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文件
    • 数据中包含中文字符,读取时要考虑文件的编码
    • 数据第一行为中文的字段名

问题描述

  • 查询书名包含“程序”的书

    • 统计其数量
  • 查询评分大于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案例-图书信息分析相关推荐

  1. Python Scrapy爬虫实战(1):豆瓣网站图书信息案例- Scrapy初体验

    Scrapy,Python开发的一个快速.高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据.Scrapy用途广泛,可以用于数据挖掘.监测和自动化测试.Scrapy吸引人的 ...

  2. Python数据分析入门笔记10——简单案例练习(学生信息分析)

    系列文章目录 Python数据分析入门笔记1--学习前的准备 Python数据分析入门笔记2--pandas数据读取 Python数据分析入门笔记3--数据预处理之缺失值 Python数据分析入门笔记 ...

  3. 【PySpark】流处理案例实战:分析纽约市出租车载客信息

    Spark 两个用于流处理的组件--Spark Streaming 和 Structured Streaming.其中 Spark Streaming 是 Spark 2.0 版本前的的流处理库,在 ...

  4. Python自学笔记5:实操案例二(输出出版图书信息、《红楼梦》五位人名、图书音像勋章、身体指标)

    Python自学笔记4:实操案例二(输出出版图书信息.<红楼梦>五位人名.图书音像勋章.身体指标) 1.输出出版图书信息 这个没啥难度,就是定义变量然后输出,注意调整格式就行 book_n ...

  5. Django案例:显示图书信息

    文章目录 一.提出任务 二.实现步骤 (一)创建Django项目 - books (二)创建并注册应用 - index 1.创建index应用 2.注册index应用 (三)创建数据库 - books ...

  6. 通过豆瓣Api,输入ISBN获取图书信息

    在本篇文章中,主要是通过豆瓣API实现获取图书信息的小功能. 一. 豆瓣API能干什么?   参考链接:[url]http://www.douban.com/service/ [/url] 豆瓣API ...

  7. c语言用价格统计图书信息,C语言图书信息管理系统代码.doc

    课 程 报 告 课 程 名 称: 程序设计实践 专 业 班 级 : 计算机类1504 学 生 姓 名 : 学 号 : 任 课 教 师 : 许伟涛 学 期 :2015-2016学年第二学期 课程报告任务 ...

  8. 2021年大数据Spark(二十一):Spark Core案例-SogouQ日志分析

    目录 案例-SogouQ日志分析 业务需求 准备工作 HanLP 中文分词 样例类 SogouRecord 业务实现 ​​​​​​​搜索关键词统计 ​​​​​​​用户搜索点击统计 ​​​​​​​搜索时 ...

  9. [源码和文档分享]基于VC++控制台实现的图书信息管理系统

    1 需求分析 开发一个图书信息管理系统,图书信息包括:图书编号.书名.作者.出版社.类别.出版时间.价格等基本信息(也可以根据自己情况进行扩充,比如是否借出.库存量等).使之能提供以下基本功能: 图书 ...

  10. JavaWeb-综合案例(用户信息)-学习笔记06【复杂条件查询功能】

    Java后端 学习路线 笔记汇总表[黑马程序员] JavaWeb-综合案例(用户信息)-学习笔记01[列表查询] JavaWeb-综合案例(用户信息)-学习笔记02[登录功能] JavaWeb-综合案 ...

最新文章

  1. 转:【小作品】STM32无线WIFI视频小车制作剖析(下)
  2. kerberos 身份认证 简介
  3. secureCrt个人操作手册
  4. C++中transform的用法
  5. 极光推送收费标准_刚刚,安卓统一推送又有进展了!华为率先...
  6. oj系统格式错误_论文查重会不会检查格式?【paperpp吧】
  7. Qt之QParallelAnimationGroup
  8. 特斯拉已撤回德国电池工厂建厂补贴申请 原有望获得近13亿美元
  9. python代码中怎么增加数据_python 实现数据库中数据添加、查询与更新的示例代码...
  10. android 溢出按钮,React-Native封裝Tabbar 實現中間按鈕溢出效果(Android/iOS)
  11. redis报错: redis.exceptions.ResponseError: value is not an integer or out of range
  12. android连接打印机打印pdf文件,如何在Android设备上打印PDF文件
  13. es6 7 8 9 10特性归纳
  14. 常见的分布期望及其方差
  15. “茄汁Ketchup”一词从汉语到英语的文化旅游
  16. Java 网络编程:(七)UDP网络编程
  17. android实时投屏软件下载,安卓投屏助手
  18. Android 如何在关于手机界面添加个图片
  19. mybatis动态SQL多条件查询1 - if 标签
  20. KNN分类——matlab(转载)

热门文章

  1. SAP系统如何打NOTE?
  2. java 拦截器的作用?
  3. 在DSP28335上使用RTOS的经验总结
  4. python基础语法总结(超详细)
  5. 7种方案,彻底实现Python可视化图片大小/分辨率控制自由
  6. #百度云直链下载-IDM+油猴插件
  7. java如何建立数据库_Java怎么连接数据库
  8. 安卓开发 JAVA环境配置
  9. 如何下载MySQL的JDBC驱动包
  10. 如何判断电脑是否中毒(转)