pySpark数据帧转换性能



我最近开始使用pySpark。(在此之前,我曾与Pandas合作(我想了解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条路对我来说更清晰。我和潘达斯的工作逻辑是一样的
但正如我所理解的,RDD,即Spark数据帧下的RDD-不可变
这意味着,当我进行变量分配时,Spark每次都会创建新的RDD
根据这个逻辑,我应该使用第二种方法来节省内存?

或者我应该兑现数据帧?或者Spark优化了这些步骤?

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

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

这就是所谓的"Wholestage Codegen"。如果适用,每个物理转换、运算符生成逻辑和代码都会融合到一个Java函数中,该函数在每个阶段进行编译和运行。

与pyspark perse无关。

请参阅https://www.waitingforcode.com/apache-spark-sql/why-code-generation-apache-spark-sql/read

最新更新