如何避免一次又一次地对pyspark数据帧进行每次转换的重新评估

问题描述 投票:1回答:1

我有一个火花数据框。我正在对数据框进行多次转换。我的代码如下:

df = df.withColumn ........
df2 = df.filter......
df = df.join(df1 ...
df = df.join(df2 ...

现在我大约有30多个这样的变换。我也知道数据帧的持久性。所以,如果我有这样的转换:

df1 = df.filter.....some condition
df2 = df.filter.... some condtion
df3 = df.filter... some other conditon

在上述情况下,我将数据帧“ df”保留下来。

现在的问题是,火花运行时间太长(8 + mts),有时它会因Java堆空间问题而失败。但是经过10多次转换后,如果我保存到表(持久性配置单元表)并在下一行从表中读取数据,则大约需要3毫秒以上的时间才能完成。即使将其保存到内存表的中间表中,它也不起作用。群集大小也不是问题。

# some transformations
df.write.mode("overwrite").saveAsTable("test")
df = spark.sql("select * from test")
# some transormations    ---------> 3 mts

# some transformations
df.createOrReplaceTempView("test")
df.count() #action statement for view to be created
df = spark.sql("select * from test")
# some more transformations  --------> 8 mts.    

我看了spark sql plan(仍然不完全了解它)。看起来spark一次又一次地重新评估同一数据帧。

我做错了什么?我不必将其写入中间表。

编辑:我正在使用azure databricks 5.3(包括Apache Spark 2.4.0,Scala 2.11)

apache-spark pyspark pyspark-sql pyspark-dataframes
1个回答
1
投票

您应该使用缓存。

尝试使用

df.cache
df.count

使用计数强制缓存所有信息。

也建议您看看thisthis

© www.soinside.com 2019 - 2024. All rights reserved.