apache-spark - 在 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")
所以没有区别(除非整个数据帧在加载后存储在内存中(不仅在评估上))?
解决方案
阅读少量列肯定有性能优势,收益程度因数据格式和来源而异。
如果您使用像 Parquet 这样的列式数据源,那么只读取相关的列组会很有帮助。它减少了 IO、内存占用和反序列化数据所需的时间。列式数据库也有同样的好处。
如果数据源不是文本、csv、avro 文件或 Oracle、MS Sql 等数据库的列式数据源,那么它不会减少 IO,但是您可能会受益于更少的内存占用和数据库的数据传输成本。读取非列文件可能没有显着的好处。
它可能会增加代码的复杂性,特别是如果您使用的是案例类支持的 Dataset。如果您选择几列,那么它将与基础案例类不匹配。如果您使用的是数据框,那么问题不大。
推荐阅读
- lua - 在 LUA 中生成星形图案
- html - 如何使用 css 移动卡片内的不同项目
- laravel - 如何在不转义刀片中的大括号的情况下使用@{{}}?
- react-native - 如何在 React-native 应用中实现本地化
- r - 在保留第二个列表名称的同时取消列出列表列表
- c# - 在 Web API 中转换日期时间格式
- java - 将空字符串传递给黄瓜数据表
- python - 每三个整数打印一个带点的大整数(打印为 str 的整数)
- swift - 如何在 SwiftUI 中更改选项卡项目的颜色
- couchdb - 如何将 CouchDB 配置为仅接受具有特定 aud(受众)声明的 JWT?