Spark Dataframe 和 Pandas Dataframe 之间的区别

pythonpandasserver side programmingprogramming

Spark DataFrame

Spark DataFrame 是一个按命名列建立的分布式数据集。它是 Apache Spark 中的关键数据结构,Apache Spark 是一种针对大数据处理进行了优化的快速分布式计算工具。在分布式计算环境中,Spark DataFrames 提供了用于处理已建立和半结构化数据的更高级别的 API。

Pandas DataFrame

Pandas DataFrame 是一种表示表格数据的二维标记数据结构。它是 Python 中 Pandas 库提供的核心数据结构之一。 DataFrame 以行列格式组织数据,类似于表格或电子表格。

优点

Spark DataFrames Pandas DataFrames
可以处理超出单个设备内存潜力的海量数据集,并利用 Spark 的计算能力。 用户友好的 API 具有直观的语法,使管理和检查结构化数据变得顺畅。
优化信息处理,最大限度地减少数据混洗,并优化执行计划。 拥有丰富的库环境,为统计操作、可视化和机器学习提供有效的工具。
通过将工作负载重新分配到集群内的其他节点,自动从故障中恢复。 支持多种数据格式,允许与本地数据源无缝集成。
支持多种数据源,允许与其他数据格式无缝集成。 可以完全在内存中运行,实现快速高效的数据处理。
支持跨机器集群的并行处理,非常适合大数据处理任务。 提供丰富的功能和操作,用于数据操作、探索和分析。

缺点

Spark DataFrames Pandas DataFrames
需要分布式计算环境和集群配置,与 Pandas DataFrames 等单机解决方案相比,这增加了复杂性。 单台计算机的内存容量导致的内存限制使其处理海量数据集的效率较低。
由于计算的分布式特性,它会产生开销,这可能会引入额外的延迟,使其对于中小型数据集的效率大大降低。 缺乏内置的分布式计算功能,使其在运行大型数据集时效率低于 Spark DataFrames。

示例 1

我们将展示使用 PySpark 开发 Spark DataFrame 和使用 pandas 开发 Pandas DataFrame 的不同之处。

算法

  • 引入必要的库

  • SparkSession 创建:要构建构建器项,请使用 SparkSession.builder。

  • 通过开发字典列表来定义数据

  • 要构建 Spark DataFrame,请使用 createDataFrame(data)。

  • 使用 pd.DataFrame(data) 创建 Pandas DataFrame

  • 显示每个单独的 Dataframes。

示例

from pyspark.sql import SparkSession
import pandas as pd
# 创建 SparkSession
spark = SparkSession.builder.appName("SparkDataFrameExample").getOrCreate()

# 从字典列表创建 DataFrames
data = [{"name": "Ashwin", "age": 25}, {"name": "Pooja", "age": 30}, {"name":
"John", "age": 28}]
Sdf = spark.createDataFrame(data)
Pdf = pd.DataFrame(data)

# 显示 Spark DataFrame
print("Structure of Spark DataFrame")
Sdf.show()
# 显示 Pandas DataFrame
print("Structure of Pandas DataFrame")
print(Pdf)

输出

Structure of Spark DataFrame
+------+---+
|  name|age|
+------+---+
|Ashwin| 25|
| Pooja| 30|
|  John| 28|
+------+---+

Structure of Pandas DataFrame
 name  age
0  Ashwin   25   #displays along with the index number
1   Pooja   30
2   John   28

Spark DataFrame 以表格形式显示,而 Pandas DataFrame 则以表格形式打印,索引从 0 开始自动编制

我们还可以看到,在 pandas dataframe 中,输出显示相应的索引号。

示例 2

我们将创建一个 spark dataframe 和 pandas dataframe,其中包含作业数据,然后在两个数据框中执行聚合,以找出语法中的差异并找到每个作业的数量。

算法

  • 通过导入 pyspark 和 pandas 开始。

  • 启动 SparkSession:

  • 用字典列表概述数据,并使用这些记录创建 pandas 和 spark dateframes。

  • 在 Spark DataFrame 中聚合数据:

    • Sdf.groupby("job") 通过"job"列组织 DataFrame

    • count() 用于计算每个作业的出现次数。

  • 聚合 Pandas DataFrame 中的数据:

    • Pdf.groupby("job") 通过"job"列分隔 DataFrame

    • size() 依赖每个作业的出现次数

    • reset_index(name="count") 重置索引并将聚合列重命名为"count"

  • 打印聚合的 Pandas 和 spark 数据框。

示例

从 pyspark.sql 导入 SparkSession
导入 pandas 作为 pd

# 创建 SparkSession
spark = SparkSession.builder.appName("SparkDataFrameExample").getOrCreate()

# 从表示作业的字典列表创建 Spark DataFrame
data = [{"job": "Engineer"}, {"job": "Analyst"}, {"job": "Analyst"}, {"job":
"Manager"}, {"job": "Engineer"}]
Sdf = spark.createDataFrame(data)

# 创建表示作业的 Pandas DataFrame
Pdf = pd.DataFrame(data)

# 在 Spark DataFrame 中聚合数据
grouped_df_spark = Sdf.groupby("job").count()

# 在 Pandas 中聚合数据DataFrame
grouped_df_pandas = Pdf.groupby("job").size().reset_index(name="count")

# 显示聚合的 Pandas DataFrame
print(grouped_df_pandas)

# 显示聚合的 Spark DataFrame
grouped_df_spark.show()

输出

   job  count
0   Analyst   2
1   Engineer   2
2   Manager   1

+--------+-----+
|   job|count|
+--------+-----+
| Analyst|   2|
|Engineer|   2|
| Manager|   1|
+--------+-----+

Spark DataFrame 与 Pandas DataFrame 比较表

功能 Spark DataFrame Pandas DataFrame
计算环境 用于大数据处理的分布式计算框架,多个节点。 适用于较小数据集的单节点环境。
性能和可扩展性 高度可扩展且高效的大数据处理。 适用于中小型数据集的出色性能。
数据处理模型 惰性求值和优化的执行计划。 即时计算,实现交互式数据探索。
语言支持 支持 Scala、Java、Python 和 R。 主要为 Python 构建,具有广泛的 Python 生态系统集成。
索引 这不提供带索引输出 它们提供从 0 开始的默认索引号
数据操作 具有广泛的转换和操作。 一组丰富的数据操作和分析函数。
生态系统和集成 与 Apache Spark 生态系统无缝集成。 与 Python 库(例如 NumPy、Matplotlib)很好地集成。
数据分区 支持分区和分区级别的并行处理。 没有内置分区功能。
内存使用情况 针对分布式处理优化的内存管理。 依赖于单节点环境中的可用内存。

结论

Spark 和 Pandas Dataframe 都是处理结构化数据的强大工具,但它们有一些关键区别。如果我们在单台机器上处理中小型数据集,Pandas DataFrames 提供了一种方便高效的解决方案。如果您正在处理大规模数据或在分布式计算环境中工作,Spark DataFrames 因其可扩展性和容错性而更适合。


相关文章