pySpark 数据框转换性能

Posted

技术标签:

【中文标题】pySpark 数据框转换性能【英文标题】:pySpark dataframe transformations performance 【发布时间】:2021-12-31 14:04:03 【问题描述】:

我最近开始使用 pySpark。 (在此之前我与熊猫一起工作) 我想了解 Spark 如何在数据帧上执行和优化转换。

我可以使用带有数据框的一个变量一一进行转换吗?

#creating pyspark dataframe

from datetime import datetime, date
import pandas as pd
from pyspark.sql import Row
from pyspark.sql.functions import col,lit

df = spark.createDataFrame([
    Row(a=1, b=2., c='string1', d=date(2000, 1, 1), e=datetime(2000, 1, 1, 12, 0)),
    Row(a=2, b=3., c='string2', d=date(2000, 2, 1), e=datetime(2000, 1, 2, 12, 0)),
    Row(a=4, b=5., c='string3', d=date(2000, 3, 1), e=datetime(2000, 1, 3, 12, 0))
])

喜欢这里 转换方式#1:

df1 = df
df1 = df1.withColumn("d", lit("new value"))
df1 = df1.withColumn("b", col("b") + 2)
df1 = df1.select("a","b","d")

或者我应该在一个变量赋值中使用所有转换? 喜欢这里 转换方式#2:

df2 = (
       df.withColumn("d", lit("new value"))
         .withColumn("b", col("b") + 2)
         .select("a","b","d")
)

方式#1 对我来说更清楚。我对 Pandas 使用了相同的逻辑。 但据我所知,RDD,它在 Spark 数据帧下 - 不可变这意味着,当我进行变量分配时,Spark 每次都会创建新的 RDD? 从这个逻辑来看,我应该使用 Way#2 来节省内存?

或者我应该兑现数据帧?还是 Spark 优化了这一步?

很高兴了解考拉在这种情况下也是如何工作的

【问题讨论】:

您能回复一下吗?新年快乐.. 【参考方案1】:

就风格而言,这是一个见仁见智的问题,但 Spark 使用“惰性评估”,因此在“动作”执行之前,它会将“转换”“融合”到每个“阶段”可以完成的最佳操作。

这又称为“Wholestage Codegen”。如果适用,每个物理转换、运算符生成逻辑、代码都被融合到一个 Java 函数中,该函数在每个阶段编译和运行。

与 pyspark 本身无关。

见https://www.waitingforcode.com/apache-spark-sql/why-code-generation-apache-spark-sql/read

【讨论】:

以上是关于pySpark 数据框转换性能的主要内容,如果未能解决你的问题,请参考以下文章

使用圆形函数转换 pyspark 数据框列不起作用(pyspark)

将 pyspark 数据框转换为 python 字典列表

将嵌套字典键值转换为 pyspark 数据框

将矩阵转换为 Pyspark 数据框

在 PySpark 中转换数据框模式 [重复]

数据类型转换火花数据框列 - pyspark