导读:本文通过比较 Pandas、Polars 和 PySpark 三种工具的不同数据集处理,得出数据处理未来发展方向的结论。希望对各位大数据开发者有所启发。
最近,我一直在使用Polars和PySpark ,这让我回到并想起了Spark热度最鼎盛的日子,每个数据处理解决方案似乎都围绕它展开。
这些项目,有时让我不禁要问:这真的有必要这么干吗?
接下来就让我们深入研究一下,我在各种数据处理技术方面的经验和实践。
背景
在我刚刚完成学业里,也就是关于情感分析的最后一个项目里,Pandas 刚刚开始成为特征工程的主流工具。它用户友好,并且与多个机器学习库(例如 scikit-learn)无缝集成。
然后,当我正式参加工作时,Spark 成为日常生活的一部分。我将它用在新兴数据湖中的ETL流程来实现业务逻辑,尽管我想了解是否过度设计了这些流程。
通常,我们处理的数据量不足以需要使用 Spark,但每次新数据进入系统时都会使用它。我们必须建立一个系统集群,然后使用 Spark 进行处理。
在一些情况晨,我感觉到 Spark 并不是适合这项工作的工具。
有一次经历中,我使用 Pandas 开发一个轻量级的摄取框架。但是,这个框架并没有达到预期的效果,在处理中型到大型文件时遇到了困难。
于是就在最近,我开始使用 Polars 来执行一些任务,它在处理数百万行数据集方面的性能给了我留下深刻的印象。这也引发我为这些工具设置了不同的基准。
接下来就让我们深入了解。
Pandas
Pandas 一直是数据操作、探索和分析的主流工具。由于 Pandas 与 R 网格视图的相似性,它在数据科学家中正在越来越受欢迎。而且,它与机器学习领域相关的其他Python库同步。比如:
-
NumPy是一个用于实现线性代数和标准计算的数学库。Pandas 基于 NumPy。
-
Scikit-learn是机器学习应用程序的参考库。通常,模型使用的所有数据都已使用 Pandas 或 NumPy 加载、可视化和分析。
PySpark
Spark 是一个免费的分布式计算机平台,它以 PySpark 作为其Python库,从而改变了大数据处理的范式。
它提供了具有卓越功能的统一计算引擎:
-
内存中处理:Spark 的主要特点是内存式架构,该架构速度很快,它将所有数据保存在内存中,而不是磁盘上。
-
容错:软件内置的容错机制确保可靠的数据处理。弹性分布式数据集进行数据跟踪,并允许在发生故障时自动恢复。
-
可扩展性:Spark 的水平可扩展架构能够自适应地处理大型数据集,并更快地将数据分发到集群。数据是分布式的,利用集群中所有节点的巨大力量。
Polars
Polars 是一个基于 Rust 构建的 Python 库,它将 Python 的灵活性和用户友好性,与 Rust 的速度和可扩展性结合起来。
大家知道,Rust 是一种低级语言,优先考虑性能、可靠性和生产力。它处理内存效率相当高,性能与 C 和 C++ 相当。
另一方面,Polars 使用 Apache Arrow 作为查询引擎来执行矢量化查询。Apache Arrow 是一个用于快速内存处理的跨语言开发平台。
Polars 可以即时执行表格数据操作、分析和转换操作,有利于大型数据集的使用。
而且,它的语法类似于SQL,数据处理的表达复杂性很容易演示。另一个功能是它的惰性,它评估查询并应用查询优化。
性能测试
设置
包含本篇文章与信息的 GitHub 链接:
https://github.com/NachoCP/Pandas-Polars-PySpark-BenchMark
每个工具有四个notbooks(两个用于极坐标,用于测试急切和惰性等评估)。
该代码将提取以下任务的执行时间:
-
读取
-
过滤
-
聚合
-
交集
-
写入
其中,有五个数据集,具有多种尺寸、50,000、250,000、1,000,000、5,000,000和25,000,000行数。用来测试不同的场景和规模。
另外,需要说明的是本次测试的数据是来自 Kaggle 的金融数据集。
测试执行于如下硬件:
macOS SonomaApple M1 Pro32 GB
执行时间,我们汇总如下表格所示:
数据行大小 | PANDAS | POLARS EAGER | POLARS LAZY | PYSPARK |
---|---|---|---|---|
50,000 行 | 0.368 | 0.132 | 0.078 | 1.216 |
250,000 行 | 1.249 | 0.096 | 0.156 | 0.917 |
1,000,000 行 | 4.899 | 0.302 | 0.300 | 1.850 |
5,000,000 行 | 24.320 | 1.605 | 1.484 | 7.372 |
25,000,000 行 | 187.383 | 13.001 | 11.662 | 44.724 |
接下来,结果分析如下:
-
Pandas表现不佳,尤其是随着数据集大小的增加时。但是,它处理小型数据集时,具有非常不错的性能与时间比。
-
PySpark在单机上执行时,当数据集尺寸增长时,它比 Pandas 表现出了相当大的改进。
-
Polars显著优于其他工具,与 Pandas 相比提高了 95-97%,与 PySpark 相比提高了 70-75%,证实了它在单机上处理大型数据集的效率。
视觉表现
这些视觉辅助工具,有助于强调不同工具在各种测试条件下的相对效率。
-
Pandas表现不佳,尤其是随着数据集大小的增加时。但是,它处理小型数据集时,具有非常不错的性能与时间比。
-
PySpark在单机上执行时,当数据集尺寸增长时,它比 Pandas 表现出了相当大的改进。
-
Polars显著优于其他工具,与 Pandas 相比提高了 95-97%,与 PySpark 相比提高了 70-75%,证实了它在单机上处理大型数据集的效率。
视觉表现
这些视觉辅助工具,有助于强调不同工具在各种测试条件下的相对效率。
这些视觉辅助工具,有助于强调不同工具在各种测试条件下的相对效率。
结论
以上提供的基准测试结果,可以清楚地了解四种广泛使用的数据处理工具在不同数据集大小上的性能、可扩展性。
通过分析,我们可以得出几个关键结论:
-
Pandas 性能可扩展性:在较小数据集中的数据操作中非常受欢迎,但随着数据量的增加,它的性能会明显下降,这表明它对于大容量数据来说并不是最好的。然而,它与许多机器学习和统计库的集成,使其对于数据科学团队来说不可或缺。
-
Polars 的效率:Polars 的配置(Eager 和 Lazy)在所有测试规模上都表现出卓越的性能,大幅度优于 Pandas 和 PySpark,使 Polars 成为能够处理大型数据集的高效工具。然而,在Polars 发布 Python 的主版本这前,我并不推荐将其用于生产系统。
-
工具选择策略:研究结果强调了,根据项目的具体需求与可用资源选择正确工具之重要性。对于中小型数据集,Polars 提供了显著的性能优势。对于大规模分布式处理,PySpark 仍然是一个强大的选择。
-
未来考量:随着数据集规模的不断增长与处理需求的增加,数据处理工具的选择将变得更加关键。
像 Polars 这样基于Rust构建的工具正在出现,其结果必须得到考虑。此外,使用 Spark 作为处理一切解决方案的趋势正在消失,当不需要大规模分布式系统时,其它的工具正在取代它们。
是的,使用正确的工具完成正确的工作!
作者:万能的大雄