我有一个火花数据框。我正在对数据框进行多次转换。我的代码如下:
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)