温馨提示:本文翻译自stackoverflow.com,查看原文请点击:apache spark - Is there any performance (or other) benefit to loading less columns in pyspark dataframe?
apache-spark pyspark-sql

apache spark - 在pyspark数据框中加载较少的列是否有任何性能(或其他)好处?

发布于 2020-04-08 10:10:20

在pyspark数据框中加载较少的列是否有任何性能(或其他)好处?

基本上,我的用例是我有一个大表(许多行,许多列)作为数据帧加载到其中,以便根据两者中的匹配键来过滤另一个表,例如...

filter_table = sparksession.read.load("/some/path/to/files").select("PK").dropDuplicates()
table_to_filter = table_to_filter.join(filter_table.select("PK"), "PK", "leftsemi")

我的问题是:这样加载表有什么好处

filter_table = sparksession.read.load("/some/path/to/files").select("PK")

vs

filter_table = sparksession.read.load("/some/path/to/files")

我怀疑我对spark的惰性评估如何工作感到困惑(对于使用spark是非常陌生的),但是我会认为由于我只使用过表,.select("PK")所以没有区别(除非整个数据帧一旦加载就存储在内存中(而不仅仅是评估))?

查看更多

提问者
lampShadesDrifter
被浏览
139
Salim 2020-02-01 05:46

读取很少的几列绝对会带来性能上的好处,好处的程度取决于数据格式和源。

如果您正在使用像Parquet这样的列式数据源,那么通过仅读取相关的列组,它会很有帮助。它减少了IO,内存占用量以及反序列化数据所需的时间。柱状数据库也有同样的好处。

如果数据源不是像文本,csv,avro文件或Oracle,MS Sql这样的数据库之类的列,那么它不会减少IO,但是您可能会受益于更少的内存占用和数据库的数据传输成本。读取非列文件可能不会有很大的好处。

这可能会增加代码的复杂性,尤其是在使用案例类支持的数据集的情况下。如果选择的列很少,则它将与基础案例类不匹配。如果您使用的是数据框,那么问题就不多了。