首页 > 解决方案 > 强制存储在驱动程序节点上的 Spark 数据集(而不是 pandas df)是否可行?

问题描述

在我的脚本中,某些小型数据集经常连接。我注意到 join 通常比其他操作花费更长的时间,据我了解可能是因为 join 仅在驱动程序节点完成,因此每次加入前都需要将分区中的数据收集到驱动程序。

是否有可能让一些 Spark 数据集在驱动程序节点上,以便下次加入时它已经存在?我想这可能很有趣,而不是每次都将相同的数据集收集到驱动程序节点,加入,然后分派回分区,然后下一个操作收集回驱动程序以加入。

您可能会说.collect()在驱动程序节点上纯粹作为 pandas 数据帧使用和使用它。我确实多次混合和匹配 pandas 数据框和 Spark 数据框。但是,在我的场景中,除了在小连接上使用之外,它还将用于与大数据集的大连接,我broadcast join目前。

想象一下操作是

small_df = small_df.join1(...)
small_df = f1(...)
small_df = f2(...)
.....
small_df = small_df.join2(..)
...
small_df = small_df.join3(..)
result = broadcast(small_df).join(big_df)

同样,在这两种情况下,我都明白small_df总是会被拉回驱动节点进行连接。因此,理想情况下,它将保留在驱动程序节点中,同时保留 aSpark df和 not pandas df

这只是一个假设的想法;我不确定它是否可行或有效。也许它违背了 Spark 的理念,但如果可能的话,我想尝试将它与我目前的方法进行比较。

标签: scalaapache-sparkjoinpysparkapache-spark-sql

解决方案


连接是在执行程序而不是驱动程序处执行的。只要您使用连接右侧的小数据集,Spark 就会在适当的情况下自动执行广播连接。


推荐阅读