我正在寻求优化 PySpark 中的数据转换,并注意到 文档 建议在多个
.select()
调用上使用 .withColumn()
以获得更好的性能。这提出了关于 .withColumns()
(从地图添加多列的版本。它在 3.3.0 版本中引入)性能的两个问题:
.withColumns()
是否会遇到与顺序.withColumn()
调用相同的性能缺陷?.withColumns()
与.select()
相比,效率如何?withColumns 对要删除或替换的列执行额外的分析检查。 select 不会,因此它会更快,但对于您的用例来说可能不是正确的结果。
虽然此检查不像写文件那么繁重,但它仍然是一个动作并强制进行评估。
“它会更快” - 这实际上取决于表达式树的复杂程度以及是否需要读取文件(parquet 确实会受到这种影响,而 delta 不会)。如果您不知道当前架构,那么使用 withColumns 肯定更方便(自己评估架构以执行此操作最终会产生相同的性能影响)。