对比Python,PySpark 大数据处理其实更香

news2024/11/24 11:08:11

对于数据分析师、数据科学家和任何使用数据的人来说,能够熟练而有效地处理大数据是一项非常有优势的技能。

如果你已经熟悉运用 Python 和 pandas 做常规数据处理,并且想学习处理大数据,那么熟悉 PySpark,并将用其做数据处理,将会是一个不错的开始。

PySpark是一种适用于 Apache Spark 的 Python API,一种流行的大数据开源数据处理引擎。

本文的前提是,假设读者在 Python 中熟练使用 pandas 操作数据。

文章目录

    • 技术提升
    • 数据集
    • 基本使用
      • 导入数据并检查其形状
      • 检查有关数据的高级信息
      • 查看数据的前几行
      • 选择列
    • 过滤
      • 根据条件过滤数据
    • 排序
    • 聚合
      • 简单的聚合
      • 多个聚合
      • 获取唯一值
    • 按组聚合
      • 参考资料

技术提升

项目代码、数据、技术交流提升,均可加交流群获取,群友已超过2000人,添加时最好的备注方式为:来源+兴趣方向,方便找到志同道合的朋友

方式①、添加微信号:dkl88191,备注:来自CSDN
方式②、微信搜索公众号:Python学习与数据挖掘,后台回复:加群

数据集

从导包开始。在 PySpark 中,需要创建一个 Spark 会话 SparkSession。创建 Spark 会话后,可以从以下位置访问 Spark Web 用户界面 (Web UI):http://localhost:4040/。下面定义的应用程序名称appName为“PyDataStudio”,将显示为 Web UI 右上角的应用程序名称。本文将不会使用 Web UI,但是,如果您有兴趣了解更多信息,请查看官方文档[1]。

import pandas as pd
from pyspark.sql import SparkSession
spark = SparkSession.builder.appName('PyDataStudio').getOrCreate()

图片

我们将在这篇文章中使用企鹅数据集[2]。使用下面的脚本,我们将penguins.csv数据的修改版本保存在工作目录中。

from seaborn import load_dataset
(load_dataset('penguins')
    .drop(columns=['bill_length_mm', 'bill_depth_mm'])
    .rename(columns={'flipper_length_mm': 'flipper',
                     'body_mass_g': 'mass'})
    .to_csv('penguins.csv', index=False))

图片

看一下两个库之间的语法比较。为了简洁,我们仅保留显示 PySpark 输出。

基本使用

两个库的数据对象都称为 DataFrame:pandas DataFrame vs PySpark DataFrame

导入数据并检查其形状

# pandas 
df = pd.read_csv('penguins.csv') 
df.shape
# PySpark 
df = spark.read.csv('penguins.csv', header=True, inferSchema=True) 
df.count(), len(df.columns)
(344, 5)

使用 PySpark 导入数据时,指定header=True数据类型用第一行作标题,并设置inferSchema=True。可以尝试不使用这些选项导入并检查 DataFrame 及其数据类型(类似于 pandas 使用df.dtype 检查 PySpark DataFrames 的数据类型)。

与 pandas DataFrame 不同,PySpark DataFrame 没有像.shape可以直接查看数据的形状。所以要得到数据形状,我们分别求行数和列数。

检查有关数据的高级信息

# pandas
df.info()
# PySpark 
df.printSchema()
root
 |-- species: string (nullable = true)
 |-- island: string (nullable = true)
 |-- flipper: double (nullable = true)
 |-- mass: double (nullable = true)
 |-- sex: string (nullable = true)

虽然此方法不会提供与df.info()相同的输出,但它是最接近的内置方法之一。

查看数据的前几行

# pandas
df.head()
# PySpark 
df.show(5)
+-------+---------+-------+------+------+
|species|   island|flipper|  mass|   sex|
+-------+---------+-------+------+------+
| Adelie|Torgersen|  181.0|3750.0|  Male|
| Adelie|Torgersen|  186.0|3800.0|Female|
| Adelie|Torgersen|  195.0|3250.0|Female|
| Adelie|Torgersen|   null|  null|  null|
| Adelie|Torgersen|  193.0|3450.0|Female|
+-------+---------+-------+------+------+
only showing top 5 rows

默认情况下,df.show()默认显示前 20 行。PySpark DataFrame 实际上有一个名为.head()的方法,可以查看前几行的数据,并以row对象形式打印出。运行df.head(5)提供如下输出:

df.head(5)

图片

.show()方法的输出更简洁,因此在查看数据集的top行时用.show()

选择列

# pandas 
df[['island', 'mass']].head(3)
# PySpark 
df[['island', 'mass']].show(3)
+---------+------+
|   island|  mass|
+---------+------+
|Torgersen|3750.0|
|Torgersen|3800.0|
|Torgersen|3250.0|
+---------+------+
only showing top 3 rows

虽然可以在这里使用的是类似于 pandas 的语法,而在 PySpark 中默认使用如下代码片段所示的方法选择列:

df.select('island', 'mass').show(3) 
df.select(['island', 'mass']).show(3)

过滤

根据条件过滤数据

# pandas 
df[df['species']=='Gentoo'].head()
# PySpark 
df[df['species']=='Gentoo'].show(5)
+-------+------+-------+------+------+
|species|island|flipper|  mass|   sex|
+-------+------+-------+------+------+
| Gentoo|Biscoe|  211.0|4500.0|Female|
| Gentoo|Biscoe|  230.0|5700.0|  Male|
| Gentoo|Biscoe|  210.0|4450.0|Female|
| Gentoo|Biscoe|  218.0|5700.0|  Male|
| Gentoo|Biscoe|  215.0|5400.0|  Male|
+-------+------+-------+------+------+
only showing top 5 rows

两个库之间的语法几乎相同。要获得相同的输出,还可以使用:

df.filter(df['species']=='Gentoo').show(5) df.filter("species=='Gentoo'").show(5) 

下面显示了一些常见的过滤器比较:

# pandas 
df[df['species'].isin(['Chinstrap', 'Gentoo'])].head() 
df[df['species'].str.match('G.')] .head() 
df[df['flipper'].between(225,229)].head() 
df[df['mass'].isnull()].head()1b df.loc[df['species']!='Gentoo'].head() 
df[~df['species'].isin(['Chinstrap', 'Gentoo'])].head() 
df[-df['species'].str.match('G.')].head() 
df[~df['flipper'].between(225,229)].head() 
df[df['mass'].notnull()].head()6 df[(df['mass']<3400) & (df['sex']=='Male')].head() 
df[(df['mass']<3400) | (df['sex']=='Male')].head()

# PySpark 
df[df['species'].isin(['Chinstrap', 'Gentoo'])].show(5) 
df[df['species'].rlike('G.')].show(5) 
df[df['flipper'].between(225,229)].show(5) 
df[df['mass'].isNull()].show(5)1b df[df['species']!='Gentoo'].show(5) 
df[~df['species'].isin(['Chinstrap', 'Gentoo'])].show(5) 
df[~df['species'].rlike('G.')].show(5) 
df[~df['flipper'].between(225,229)].show(5) 
df[df['mass'].isNotNull()].show(5)
df[(df['mass']<3400) & (df['sex']=='Male')].show(5) 
df[(df['mass']<3400) |(df[ 'sex']=='Male')].show(5)

虽然~-在 pandas 中都可以作为否定,但在 PySpark 中仅有~能作为有效的否定。

排序

对数据进行排序并检查mass最小的 5 行:

# pandas 
df.nsmallest(5, 'mass')
# PySpark 
df[df['mass'].isNotNull()].orderBy('mass').show(5)
+---------+------+-------+------+------+
|  species|island|flipper|  mass|   sex|
+---------+------+-------+------+------+
|Chinstrap| Dream|  192.0|2700.0|Female|
|   Adelie|Biscoe|  184.0|2850.0|Female|
|   Adelie|Biscoe|  181.0|2850.0|Female|
|   Adelie|Biscoe|  187.0|2900.0|Female|
|   Adelie| Dream|  178.0|2900.0|Female|
+---------+------+-------+------+------+
only showing top 5 rows

Pandas的.nsmallest().nlargest()方法会自动排除缺失值。而 PySpark 没有等效的方法。为了获得相同的输出,首先过滤掉缺失mass的行,然后对数据进行排序并查看前 5 行。如果没有删除数据,可以简写为:

df.orderBy(‘mass’).show(5).sort()

代替的另一种排序方式.orderBy()

# pandas 
df.nlargest(5, 'mass')
# PySpark 
df.sort('mass', ascending=False).show(5)
+-------+------+-------+------+----+
|species|island|flipper|  mass| sex|
+-------+------+-------+------+----+
| Gentoo|Biscoe|  221.0|6300.0|Male|
| Gentoo|Biscoe|  230.0|6050.0|Male|
| Gentoo|Biscoe|  220.0|6000.0|Male|
| Gentoo|Biscoe|  222.0|6000.0|Male|
| Gentoo|Biscoe|  229.0|5950.0|Male|
+-------+------+-------+------+----+
only showing top 5 rows

这些语法的变体也是等效的:

df.sort(df['mass'].desc()).show(5) 
df.orderBy('mass', ascending=False).show(5) 
df.orderBy(df['mass'].desc( )).show(5)

按多列排序,如下所示:

# pandas 
df.sort_values(['mass', 'flipper'], ascending=False).head()
# PySpark 
df.orderBy(['mass', 'flipper'], ascending=False).show(5)
+-------+------+-------+------+----+
|species|island|flipper|  mass| sex|
+-------+------+-------+------+----+
| Gentoo|Biscoe|  221.0|6300.0|Male|
| Gentoo|Biscoe|  230.0|6050.0|Male|
| Gentoo|Biscoe|  222.0|6000.0|Male|
| Gentoo|Biscoe|  220.0|6000.0|Male|
| Gentoo|Biscoe|  229.0|5950.0|Male|
+-------+------+-------+------+----+
only showing top 5 rows

在 PySpark 中,可以在将所有列分别传参数,而不需要写成列表的形式

df.orderBy('mass', 'flipper', ascending=False).show(5)

要按多列但按不同方向排序:

# pandas 
df.sort_values(['mass', 'flipper'], ascending=[True, False]).head()
# PySpark 
df[df['mass'].isNotNull()]\ 
  .sort('mass', 'flipper', ascending=[True, False]).show(5)
+---------+---------+-------+------+------+
|  species|   island|flipper|  mass|   sex|
+---------+---------+-------+------+------+
|Chinstrap|    Dream|  192.0|2700.0|Female|
|   Adelie|   Biscoe|  184.0|2850.0|Female|
|   Adelie|   Biscoe|  181.0|2850.0|Female|
|   Adelie|Torgersen|  188.0|2900.0|Female|
|   Adelie|   Biscoe|  187.0|2900.0|Female|
+---------+---------+-------+------+------+
only showing top 5 rows

pyspark的另一种写法

df[df['mass'].isNotNull()]\
  .orderBy(df['mass'].asc(), df['flipper'].desc()).show(5)

聚合

现在,看几个聚合数据的示例。

简单的聚合

二者方法类似:

# pandas 
df.agg({'flipper': 'mean'})
# PySpark 
df.agg({'flipper': 'mean'}).show()
+------------------+
|      avg(flipper)|
+------------------+
|200.91520467836258|
+------------------+

多个聚合

需要采用不同的方法:

# pandas 
df.agg({'flipper': ['min', 'max']})
# PySpark 
from pyspark.sql import functions as F 
df.agg(F.min('flipper'), F.max('flipper')).show()
+------------+------------+
|min(flipper)|max(flipper)|
+------------+------------+
|       172.0|       231.0|
+------------+------------+

获取唯一值

# pandas 
df['species'].unique()
# PySpark 
df.select('species').distinct().show()
+---------+
|  species|
+---------+
|   Gentoo|
|   Adelie|
|Chinstrap|
+---------+

要在列中获取多个不同的值:

# pandas 
df['species'].nunique()
# PySpark 
df.select('species').distinct().count()
3

按组聚合

到目前为止,PySpark 使用 camelCase 驼峰命名法来表示方法和函数。.groupBy()这也是如此。这是一个简单的按聚合分组的示例:

# pandas 
df.groupby('species')['mass'].mean()
# PySpark 
df.groupBy('species').agg({'mass': 'mean'}).show()
+---------+------------------+
|  species|         avg(mass)|
+---------+------------------+
|   Gentoo| 5076.016260162602|
|   Adelie| 3700.662251655629|
|Chinstrap|3733.0882352941176|
+---------+------------------+

这是一个聚合多个选定列的示例:

# pandas 
df.groupby('species').agg({'flipper': 'sum',
                           'mass': 'mean'})
# PySpark 
df.groupBy('species').agg({'flipper': 'sum',
                           'mass': 'mean'}).show()
+---------+------------+--------------+
|  species|sum(flipper)|     avg(mass)|
+---------+------------+--------------+
|   Gentoo|     26714.0| 5076.01626016|
|   Adelie|     28683.0| 3700.66225165|
|Chinstrap|     13316.0|3733.088235294|
+---------+------------+--------------+

如果我们不指定列,它将显示所有数字列的统计信息:

# pandas 
df.groupby('species').mean()
# PySpark 
df.groupBy('species').mean().show()
+---------+--------------+--------------+
|  species|  avg(flipper)|     avg(mass)|
+---------+--------------+--------------+
|   Gentoo| 217.186991869| 5076.01626016|
|   Adelie|189.9536423841| 3700.66225165|
|Chinstrap| 195.823529411|3733.088235294|
+---------+--------------+--------------+

也可以将.mean()替换为.avg(),即可以使用df.groupBy(‘species’).avg().show()

以上就是本文的所有内容,希望能够帮到你对 PySpark 语法有所了解。我们注意到,在基本任务方面,这两个库之间有很多相似之处。这使得在熟悉 pandas 工作知识的人更容易开始使用 PySpark,在处理小数据分析与挖掘后,遇到大数据分析与挖掘时,也能够轻松面对。

参考资料

[1]

官方文档: https://spark.apache.org/docs/latest/web-ui.html

[2]

企鹅数据集: https://github.com/mwaskom/seaborn-data/blob/master/penguins.csv

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/20746.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

免费搜题系统搭建

免费搜题系统搭建 本平台优点&#xff1a; 多题库查题、独立后台、响应速度快、全网平台可查、功能最全&#xff01; 1.想要给自己的公众号获得查题接口&#xff0c;只需要两步&#xff01; 2.题库&#xff1a; 查题校园题库&#xff1a;查题校园题库后台&#xff08;点击跳…

C语言详细知识点复习(上)

文章目录一、C语言概述1、C语言的主要特点2、算法的概念及特点二、C程序设计的基础语法1、常量和变量2、数据类型3、运算符和表达式4、C 语句5、数据的输入和输出三、选择结构四、循环结构1、循环结构2、break\continue3、循环程序举例一、C语言概述 1、C语言的主要特点 程序…

微信小程序最新用户头像昵称获取规则调整应对措施(2022)

目录一、调整二、应对措施2.1 更新头像2.2 更新昵称三、完整代码一、调整 小程序用户头像昵称获取规则调整公告 以前通过wx.getUserProfile获取用户信息&#xff0c;用户点击同意以后&#xff0c;便可以直接获取相关信息&#xff0c;但是官方最近做出了调整&#xff0c;直接将…

图书管理系统

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 目录 文章目录 前言 一.界面设计 1.管理员菜单 2.用户菜单 3.用户操作&#xff1a; 查找图书借阅图书归还图书显示图书 4.管理员操作 查找图书新增图书删除图…

【Matlab】Matlab导入多个.mat文件并画图的过程详解

Matlab导入多个.mat文件并画图的过程详解0. 实验背景1. 导入.mat文件存储1.1 导入.mat文件及作图最简单的方式&#xff1a;1.2 导入.mat文件及作图的脚本代码2. plot画图总结2.1 画散点图2.1.1 点形状2.1.2 点大小2.1.3 点颜色2.1.4 点填充2.2 画折线图2.2.1 折线形状2.2.2 折线…

多路转接(IO复用)接口介绍

文章目录引言select函数声明参数以及类型介绍返回值select代码演示优缺点poll函数声明参数以及类型介绍返回值poll代码演示优缺点epollepoll三调用简述epoll实现原理epoll代码演示epoll工作方式对比LT和ET注意点引言 此文仅仅作为多路转接api的介绍和使用,而对于五种IO模型的介…

闲活章始:初创纪元

OK先说好&#xff0c;标题沙雕的原因是因为要求不少于5个字 不打算提炼语言了&#xff0c;浓缩表达是个费事活。既然文章归为闲活&#xff0c;其中也来些闲话较好。主要给自己看&#xff0c;能帮助他人更妙。 待闲活干好之日&#xff0c;就是文章收费之时。 做什么 做…

(JVM)运行时数据区的总结以及常见大厂面试题

运行时数据区的总结以及常见大厂面试题 线程私有的&#xff1a;程序计数器、本地方法栈、虚拟机栈 虚拟机栈里的栈帧的结构&#xff1a;返回值、局部变量表、操作数栈、动态链接&#xff08;装着指向运行时常量池的当前方法的引用&#xff0c;知道当前方法是引用运行时常量池中…

中国制造2025-智能制造是强国必由之路

《中国制造2025》十大重点领域 新一代信息技术产业&#xff1a;集成电路及专用设备、信息通信设备、操作系统与工业软件、智能制造核心技术信息设备 高档数控机床和机器人&#xff1a;高档数控机床与基础制造装备、机器人 航空航天装备:飞机、航空发动机、航空机载设备与系统…

软件测试---前言篇

一 : 主要内容 二 : 什么是软件测试 在规定的条件下对程序进行操作&#xff0c;以发现程序错误&#xff0c;衡量软件质量&#xff0c;并对其是否能满足设计要求进行评估的过程.上面这是官话 . 在我们日常生活中 , 就有许多测试的行为 , 比如地铁站的金属检测仪 , 用于检测旅客…

【SpringBoot笔记26】SpringBoot框架集成ElasticSearch数据库

这篇文章&#xff0c;主要介绍SpringBoot框架如何集成ElasticSearch数据库。 目录 一、SpringBoot集成ES 1.1、ElasticSearch介绍 1.2、引入ES依赖 1.3、实例化ES对象 1.4、创建测试控制器 一、SpringBoot集成ES 1.1、ElasticSearch介绍 ElasticSearch是一款分布式&…

[附源码]java毕业设计网上购物商城系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Allegro只给孔或pin加背钻属性操作指导

Allegro只给孔或pin加背钻属性操作指导 Allegro支持只给孔加背钻属性,除了孔,pin也是可以的,具体操作步骤如下 选择Edit-Property命令 Find选择Net 选择需要背钻的网络添加背钻属性,点击OK 设置下背钻参数 选择背钻种类,top钻选择top,bottom钻选择bottom 把需要背钻…

科研笔记—Ergodic Rate Analysis of STAR-RIS Aided NOMA Systems

Ergodic Rate Analysis of STAR-RIS Aided NOMA Systems 1 STAR-RIS2 摘要3 系统模型3.1 信道3.2 用户位置3.3 ES&#xff08;Energy Splitting&#xff09;能量分裂协议3.4 NOMA3.5 信道模型3.6 信干噪比4 仿真4.1 遍历率分析星型智能反射面辅助NOMA系统的遍历率分析 原文链接…

Day08--初步创建并使用自定义组件

提纲挈领&#xff1a; 1.如何创建自定义组件&#xff1f; 我的操作&#xff1a; ************************************************* ************************************************* ************************************************* *****************************…

Netty:入门(2)

相关文章&#xff1a; 《IO 模型与多路复用》 《Java NIO》 《Netty&#xff1a;入门&#xff08;1&#xff09;》 写在开头&#xff1a;本文为学习后的总结&#xff0c;可能有不到位的地方&#xff0c;错误的地方&#xff0c;欢迎各位指正。 前言 在前文中&#xff0c;我们…

Spring 中 Bean 对象的存储和取出

由于 Spring 拥有对象的管理权&#xff0c;所以我们也需要拥有较为高效的对象存储和取出的手段&#xff0c;下面我们来分别总结一下&#xff1a; 存对象 配置文件 在存储对象之前&#xff0c;我们需要先配置一下 Spring 的扫描目录&#xff0c;这样 Spring 即可在正确的目录…

JVM复习【面试】

JVM复习【面试】前言推荐复习【JVM】第一部分 走进Java第1章 走进Java /2第二部分 自动内存管理机制第2章 Java内存区域与内存溢出异常 /382.2 运行时数据区 /382.2.2 Java虚拟机栈 /392.3 HotSpot虚拟机对象探秘2.3.1 对象的创建 /442.3.2 对象的内存布局 /472.4 实战&#xf…

HTML-Demo:工商银行电子汇款单

HTML-Demo&#xff1a;工商银行电子汇款单 Date: November 20, 2022 Demo简介&#xff1a; 简要说明一下这个demo 用HTML完成以下表格 知识点简介&#xff1a; 简要介绍其中一些知识点 表格属性 cellspacing 与 cellpadding 功能&#xff1a; cellpadding和cellspacing属性控…

面试:java中的各种锁对比

共享锁 共享锁有CountDownLatch, CyclicBarrier, Semaphore, ReentrantReadWriteLock等 ReadWriteLock&#xff0c;顾名思义&#xff0c;是读写锁。它维护了一对相关的锁 — — “读取锁”和“写入锁”&#xff0c;一个用于读取操作&#xff0c;另一个用于写入操作。“读取锁…