将不同阶段的数据帧合并为一个数据帧[Spark]

时间:2020-10-02 13:51:05

标签: scala dataframe apache-spark apache-spark-sql

enter image description here

如您所见,我有多个窗口函数(例如计数/总和等)正在阶段(2,3,4,5,....)中执行。我可能有大约15-20个包含窗口函数的阶段。给定一个巨大的数据帧df(以GB为单位),每个窗口函数都会为其添加一个新列。最后,我希望将原始df以及这些新列中的每一个添加到新的组合数据框中。现在,这些功能正在按顺序添加新列,因此整个工作需要很长时间才能完成。

为了更快,我想到了明显的并行执行:

  1. 从每个窗口函数中,我可以将输出数据框(带有1个新列)写入AWS S3(或磁盘),然后最后将每个数据框连接到唯一键上:
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
  1. 如果我们不执行上述S3 /磁盘的读写操作,则可以节省时间,但是我不确定是否可以将运行在不同执行程序上的所有这些数据帧最终合并在一起而不会遇到任何内存问题:
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中的哪一个是解决此问题的更好方法。也欢迎其他任何建议。

0 个答案:

没有答案