在pyspark中,我需要进行一些操作并不断更改某些数据帧。
df = spark.sql("select * from my_table")
for iter in range(0,num_iter):
for v in var_list:
//....
//Operations here that changes df
df = f1()
..
df = join(df, another dataset)
df = f2(df)
..
//There are some action here that should conclude DAG of this loop
我注意到,随着循环的进行,性能下降了。最初只需要几秒钟;经过几次循环后,每次迭代需要几分钟到几小时。从YARN检查,DAG似乎随着我们的前进而增长。在某些时候,执行程序会因显示非常长的DAG的错误而失败
DAG将以这种方式增长[仅作为示例,并不是仅通过联接操作来增长DAG] []
在这种情况下是否可以提高性能?是什么导致性能下降?如果是对象占用内存,是否有办法在每个循环之后刷新它们?
每个循环的cache()(具有后续操作)是否是避免DAG堆积的良好解决方法?我确实尝试过缓存,但性能仍然下降。