如您所见,我有多个窗口函数(比如count/sum等)分阶段执行(2、3、4、5……)。我可能有大约15-20个这样的阶段包含窗口函数。给定一个巨大的Dataframedf(以gbs为单位),每个窗口函数都会向其添加一个新列。最后,我想要原始的df加上这些新列中的每一个,在一个新的组合Dataframe中。现在,这些函数正在按顺序添加新列,因此整个作业需要很长时间才能完成。
为了让这更快,我想到了明显的并行执行:
从每个窗口函数中,我可以将输出Dataframe(带有1个新列)写入aws s3(或磁盘),然后将这些Dataframe中的每一个连接到最后的唯一键上:
listOfComputationsToPerform.par.foreach{
Apply window function & compute new_dataframe
write new_dataframe to S3/disk
}
Read each dataframe again from S3 and perform joins on a unique key to compute 1 final dataframe
如果我们不从上面的s3/磁盘执行写和读操作,我们可以节省时间,但我不确定是否所有这些运行在不同执行器上的Dataframe最终都可以连接起来,而不会出现任何内存问题:
df_list=List[]
listOfComputationsToPerform.par.foreach{
compute new_dataframe => // code to be run in parallel for each i}
df_list = df_list :+ new_dataframe
df_list.reduce(_.join(_, Seq("id")))
我想知道1和2中哪一个是更好的方法。任何其他建议也欢迎。
暂无答案!
目前还没有任何答案,快来回答吧!