在我的脚本中,某些小数据集经常连接。我注意到加入通常比其他操作花费更长的时间,据我了解,可能是因为加入仅在驱动程序节点上完成,因此每次在加入之前都需要将分区中的数据收集到驱动程序。
是否有可能使一些 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 就应该会在适当的时候自动执行广播联接。