首页 > 解决方案 > 在 pyspark 数据框中加载更少的列是否有任何性能(或其他)好处?

问题描述

在 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")所以没有区别(除非整个数据帧在加载后存储在内存中(不仅在评估上))?

标签: apache-sparkpyspark-sql

解决方案


阅读少量列肯定有性能优势,收益程度因数据格式和来源而异。

如果您使用像 Parquet 这样的列式数据源,那么只读取相关的列组会很有帮助。它减少了 IO、内存占用和反序列化数据所需的时间。列式数据库也有同样的好处。

如果数据源不是文本、csv、avro 文件或 Oracle、MS Sql 等数据库的列式数据源,那么它不会减少 IO,但是您可能会受益于更少的内存占用和数据库的数据传输成本。读取非列文件可能没有显着的好处。

它可能会增加代码的复杂性,特别是如果您使用的是案例类支持的 Dataset。如果您选择几列,那么它将与基础案例类不匹配。如果您使用的是数据框,那么问题不大。


推荐阅读