Spark DataFrame 和 Pandas DataFrame 的区别


Spark DataFrame

Spark DataFrame 是一个分布式数据集,组织成命名列。它是 Apache Spark 中一个关键的数据结构,Apache Spark 是一个快速且分布式的计算引擎,针对大数据处理进行了优化。在分布式计算环境中,Spark DataFrame 为处理结构化和半结构化数据提供了更高级别的 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 创建一个构建器对象。

  • 通过创建字典列表来定义数据

  • 使用 createDataFrame(data) 创建 Spark DataFrame。

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

  • 显示每个单独的 DataFrame。

示例

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

# Creating the DataFrames from a list of dictionaries
data = [{"name": "Ashwin", "age": 25}, {"name": "Pooja", "age": 30}, {"name": 
"John", "age": 28}]
Sdf = spark.createDataFrame(data)
Pdf = pd.DataFrame(data)

# Displaying the Spark DataFrame
print("Structure of Spark DataFrame")
Sdf.show()
# Displaying the 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,然后在两个 DataFrame 中执行聚合,以找出语法差异并查找每个工作的计数。

算法

  • 从导入 pyspark 和 pandas 开始。

  • 启动 SparkSession

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

  • 聚合 Spark DataFrame 中的数据

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

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

  • 聚合 Pandas DataFrame 中的数据

    • Pdf.groupby("job") 通过“job”列分离 DataFrame

    • size() 计算每个工作的出现次数

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

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

示例

from pyspark.sql import SparkSession
import pandas as pd

# Creating a SparkSession
spark = SparkSession.builder.appName("SparkDataFrameExample").getOrCreate()

# Creating a Spark DataFrame from a list of dictionaries representing jobs
data = [{"job": "Engineer"}, {"job": "Analyst"}, {"job": "Analyst"}, {"job": 
"Manager"}, {"job": "Engineer"}]
Sdf = spark.createDataFrame(data)

# Creating a Pandas DataFrame representing jobs
Pdf = pd.DataFrame(data)

# Aggregating data in Spark DataFrame
grouped_df_spark = Sdf.groupby("job").count()

# Aggregating data in Pandas DataFrame
grouped_df_pandas = Pdf.groupby("job").size().reset_index(name="count")

# Displaying the aggregated Pandas DataFrame
print(grouped_df_pandas)

# Displaying the aggregated 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 更适合,因为它们具有可扩展性和容错性。

更新于:2023年8月10日

743 次查看

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告
© . All rights reserved.