Apache spark 如何避免pyspark数据帧上每次转换的重复评估

Apache spark 如何避免pyspark数据帧上每次转换的重复评估,apache-spark,pyspark,pyspark-sql,pyspark-dataframes,Apache Spark,Pyspark,Pyspark Sql,Pyspark Dataframes,我有一个spark数据框。我正在数据帧上进行多次转换。我的代码如下所示: df = df.withColumn ........ df2 = df.filter...... df = df.join(df1 ... df = df.join(df2 ... df1 = df.filter.....some condition df2 = df.filter.... some condtion df3 = df.filter... some other conditon 现在我有大约30多个

我有一个spark数据框。我正在数据帧上进行多次转换。我的代码如下所示:

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

现在我有大约30多个这样的转换。我还知道数据帧的持久性。因此,如果我有一些这样的转换:

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

在上述情况下,我将持久化数据帧“df”

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

# 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计划(仍然不完全理解它)。看起来spark一次又一次地重新评估相同的数据帧

我做错了什么?我不必把它写到中间表

编辑:我正在开发azure databricks 5.3(包括Apache Spark 2.4.0、Scala 2.11)


Edit2:问题是rdd长沿袭。如果rdd沿袭不断增加,我的spark应用程序似乎越来越慢。

您应该使用缓存

试用

df.cache
df.count
使用count强制缓存所有信息


另外,我建议您看一看,如果看不到实际的代码、环境设置和数据,就不能不说了