强制将 Spark 数据集存储在驱动程序节点上(而不是作为熊猫 df)是否可行?



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

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

您可以说使用.collect()并将其纯粹用作驱动程序节点上的熊猫数据帧。 我确实多次混合和匹配熊猫数据框和 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将始终拉回驱动程序节点进行连接。因此,理想情况下,它将保留在驱动程序节点中,同时保持Spark df而不是pandas df

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

联接是在执行程序而不是驱动程序上执行的。只要使用联接右侧的小数据集,Spark 就应该会在适当的时候自动执行广播联接。

最新更新