Apache spark 如何避免pyspark数据帧上每次转换的重复评估
我有一个spark数据框。我正在数据帧上进行多次转换。我的代码如下所示: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多个
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强制缓存所有信息
另外,我建议您看一看,如果看不到实际的代码、环境设置和数据,就不能不说了