Pandas 与 PySpark DataFrame 示例

让我们通过示例了解 Pandas 与 PySpark DataFrame 之间的区别、它们的定义、特性、优势、如何创建它们以及如何将它们转换为另一种。

 

什么是Pandas?

Pandas 是最常用的开源 Python 库之一,用于处理结构化表格数据进行分析。Pandas 库大量用于数据分析、机器学习、数据科学项目等。

Pandas 可以通过读取 CSV、JSON、SQL 等多种格式来加载数据,并创建一个 DataFrame,它是一个包含行和列的结构化对象(类似于 SQL 表)。

它不支持分布式处理,因此当您需要额外的马力来支持不断增长的数据时,您总是需要增加资源。

Pandas DataFrame 是可变的并且不是惰性的,默认情况下对每一列应用统计函数。您可以在Pandas DataFrame Tutorial For Beginners Guide 中了解有关 Pandas 的更多信息。

Pandas 数据帧示例

为了在 Python 中使用 Pandas 库,您需要使用import pandas as pd.

下面的示例从列表中创建一个 Pandas DataFrame。


import pandas as pd    
data = [["James","","Smith",30,"M",60000], 
        ["Michael","Rose","",50,"M",70000], 
        ["Robert","","Williams",42,"",400000], 
        ["Maria","Anne","Jones",38,"F",500000], 
        ["Jen","Mary","Brown",45,None,0]] 
columns=['First Name','Middle Name','Last Name','Age','Gender','Salary']

# Create the pandas DataFrame 
pandasDF=pd.DataFrame(data=data, columns=columns) 
  
# print dataframe. 
print(pandasDF)

在控制台上输出以下数据。请注意,Pandas 会为每个数据帧添加一个索引序列号。

Pandas 与 PySpark 数据帧

Pandas转换

以下是您可以在 Pandas DataFrame 上执行的一些转换。请注意,统计函数默认在每一列进行计算。您不必明确指定要应用统计函数的列。即使 count() 函数返回每列的计数(通过忽略 null/None 值)。

  • df.count() – 返回每列的计数(计数仅包括非空值)。
  • df.corr() – 返回数据框中列之间的相关性。
  • df.head(n) – 从顶部返回前 n 行。
  • df.max() – 返回每列的最大值。
  • df.mean() – 返回每列的平均值。
  • df.median() – 返回每列的中位数。
  • df.min() – 返回每列中的最小值。
  • df.std() – 返回每列的标准偏差
  • df.tail(n) – 返回最后 n 行。

print(pandasDF.count())
First Name     5
Middle Name    5
Last Name      5
Age            5
Gender         4
Salary         5

print(pandasDF.max())
First Name       Robert
Middle Name        Rose
Last Name      Williams
Age                  50
Salary           500000

print(pandasDF.mean())
Age           41.0
Salary    206000.0

什么是 PySpark?

简而言之,Pandas 在一台机器上运行操作,而 PySpark 在多台机器上运行。如果您正在处理处理更大数据集的机器学习应用程序,PySpark 是最合适的选择,它可以比 Pandas 快许多倍(100 倍)处理操作。

PySpark 在数据科学和机器学习社区中得到了很好的应用,因为有许多广泛使用的用 Python 编写的数据科学库,包括 NumPy,TensorFlow 也因其对大型数据集的高效处理而被使用。PySpark 已被 Walmart、Trivago、Sanofi、Runtastic 等许多组织使用。

PySpark 是一个用 Python 编写的 Spark 库,用于使用 Apache Spark 功能运行 Python 应用程序。使用 PySpark,我们可以在分布式集群(多个节点)甚至单个节点上并行运行应用程序。

Apache Spark 是一种分析处理引擎,适用于大规模强大的分布式数据处理和机器学习应用程序。

Pandas 与 PySpark 的区别

来源:https :  //databricks.com/

Spark 基本上是用 Scala 编写的,后来由于它的行业适应性,它是使用 Py4J 为 Python 发布的 API PySpark。 Py4J 是一个集成在 PySpark 中的 Java 库,允许 python 与 JVM 对象动态接口,因此要运行 PySpark,您还需要安装 Java 以及 Python 和 Apache Spark。

此外,对于开发,您可以使用 Anaconda 发行版 (在机器学习社区中广泛使用),它带有许多有用的工具,如 Spyder IDE、  Jupyter notebook 来运行 PySpark 应用程序。

PySpark 功能

  • 内存计算
  • 使用并行化的分布式处理
  • 可以与许多集群管理器(Spark、Yarn、Mesos 等)一起使用
  • 容错
  • 不可变
  • 懒惰评价
  • 缓存和持久化
  • 使用 DataFrame 时的内置优化
  • 支持 ANSI SQL

PySpark 的优势

  • PySpark 是一种通用的、内存中的分布式处理引擎,允许您以分布式方式高效地处理数据。
  • 在 PySpark 上运行的应用程序比传统系统快 100 倍。
  • 将 PySpark 用于数据摄取管道,您将获得巨大收益。
  • 使用 PySpark,我们可以处理来自 Hadoop HDFS、AWS S3 和许多文件系统的数据。
  • PySpark 还用于使用 Streaming 和 Kafka 处理实时数据。
  • 使用 PySpark 流式传输,您还可以从文件系统流式传输文件,也可以从套接字流式传输。
  • PySpark 本身具有机器学习和图形库。

PySpark 模块和包

PySpark 数据帧示例

PySpark DataFrame 是不可变的(一旦创建就不能更改),容错和转换是惰性求值(它们在调用操作之前不会执行)。PySpark DataFrame 分布在集群中(意味着 PySpark DataFrame 中的数据存储在集群中的不同机器上)并且 PySpark 中的任何操作在所有机器上并行执行。


from pyspark.sql import SparkSession
# Create SparkSession
spark = SparkSession.builder \
               .appName('SparkByExamples.com') \
               .getOrCreate()

data = [("James","","Smith",30,"M",60000),
        ("Michael","Rose","",50,"M",70000),
        ("Robert","","Williams",42,"",400000),
        ("Maria","Anne","Jones",38,"F",500000),
        ("Jen","Mary","Brown",45,"F",0)]

columns = ["first_name","middle_name","last_name","Age","gender","salary"]
pysparkDF = spark.createDataFrame(data = data, schema = columns)
pysparkDF.printSchema()
pysparkDF.show(truncate=False)

Schema 和 DataFrame 下方的输出。

熊猫 vs pyspark 数据框

读取 CSV 文件。


#Read a CSV file
df = spark.read.csv("/tmp/resources/zipcodes.csv")

PySpark 转换

PySpark 转换本质上是惰性的,这意味着它们在调用操作之前不会执行。


from pyspark.sql.functions import mean, col, max
#Example 1
df2=pysparkDF.select(mean("age"),mean("salary"))
             .show()
#Example 2
pysparkDF.groupBy("gender") \
         .agg(mean("age"),mean("salary"),max("salary")) \
         .show()

PySpark SQL 兼容

PySpark 支持 SQL 查询来运行转换。您需要做的就是从 PySpark DataFrame 创建一个表/视图。


pysparkDF.createOrReplaceTempView("Employee")
spark.sql("select * from Employee where salary > 100000").show()
#Prints result
+----------+-----------+---------+---+------+------+
|first_name|middle_name|last_name|Age|gender|salary|
+----------+-----------+---------+---+------+------+
|    Robert|           | Williams| 42|      |400000|
|     Maria|       Anne|    Jones| 38|     F|500000|
+----------+-----------+---------+---+------+------+
spark.sql("select mean(age),mean(salary) from Employee").show()
#Prints result
+---------+------------+
|mean(age)|mean(salary)|
+---------+------------+
|     41.0|    206000.0|
+---------+------------+

从 Pandas 创建 PySpark DataFrame

由于在多台机器上的所有内核上并行执行,PySpark 的运行速度比 Pandas 更快,因此我们经常需要将 Pandas DataFrame 转换为 PySpark(Spark with Python)以获得更好的性能。这是 Pandas 与 PySpark DataFrame 之间的主要区别之一。


#Create PySpark DataFrame from Pandas
pysparkDF2 = spark.createDataFrame(pandasDF) 
pysparkDF2.printSchema()
pysparkDF2.show()

从 PySpark DataFrame 创建 Pandas

在 Spark 上完成转换后,您可以使用toPandas()方法轻松地将其转换回 Pandas 。

注意: toPandas()方法是将数据收集到 Spark Driver 内存中的操作,因此在处理大型数据集时必须非常小心。如果收集的数据不适合 Spark Driver 内存,您将收到 OutOfMemoryException。


#Convert PySpark to Pandas
pandasDF = pysparkDF.toPandas()
print(pandasDF)

使用 Apache Arrow 在 Python 和 JVM 之间传输

Apache Spark 使用 Apache Arrow,这是一种内存中的列格式,用于在 Python 和 JVM 之间传输数据。您需要启用才能使用 Arrow,因为默认情况下这是禁用的。您还需要使用Apache Arrow for Pythonpip install pyspark[sql] 或直接从Apache Arrow for Python下载, 在所有 Spark 集群节点上安装 Apache Arrow (PyArrow)  。


spark.conf.set("spark.sql.execution.arrow.enabled","true")

您需要 安装 与Spark 兼容的 Apache Arrow才能使用上述语句,如果您尚未安装 Apache Arrow,则会出现以下错误。


\apps\Anaconda3\lib\site-packages\pyspark\sql\pandas\conversion.py:289: UserWarning: createDataFrame attempted Arrow optimization because 'spark.sql.execution.arrow.pyspark.enabled' is set to true; however, failed by the reason below:
  PyArrow >= 0.15.1 must be installed; however, it was not found.
Attempting non-optimization as 'spark.sql.execution.arrow.pyspark.fallback.enabled' is set to true.

当发生错误时,Spark 会自动回退到非 Arrow 优化实现,这可以通过 spark.sql.execution.arrow.pyspark.fallback.enabled.


spark.conf.set("spark.sql.execution.arrow.pyspark.fallback.enabled","true")

注意:  Apache Arrow 目前支持所有 Spark SQL 数据类型,除了 MapType、  ArrayType of TimestampType和嵌套 StructType

如何在 Pandas 和 PySpark 之间做出决定

以下是选择 PySpark 而不是 Pandas 时的一些注意事项

  • 如果您的数据很大并且多年来显着增长,并且您希望缩短处理时间。
  • 如果你想要容错。
  • ANSI SQL 兼容性。
  • 语言选择(Spark 支持 Python、Scala、Java 和 R)
  • 当您需要机器学习能力时。
  • 想阅读 Parquet、Avro、Hive、Casandra、Snowflake 等
  • 如果您想流式传输数据并实时处理它。

结论

在本文中,我在非常高的层次上介绍了 Pandas 与 PySpark DataFrame 之间的区别、功能、如何创建每个数据帧并根据需要相互转换。

猜你喜欢

转载自blog.csdn.net/allway2/article/details/121444323