我正在尝试构建一个组件,该组件将大型数据集动态连接到几个小得多的数据集。我已经将大型和较小的数据集作为数据帧保留在内存中。当用户输入时,我需要选择大型数据集的子集,并使用较小数据集中的一些信息来丰富它。
不幸的是,这些动态连接被证明是昂贵的,大约几分钟而不是几秒钟。我想探索的一种方法是将较小数据集的副本传送到群集上的所有节点,以便在每个节点上同时进行联接,并在最后简单地收集结果。但是,我不确定这样做的最佳方法。
广播变量似乎是跨节点传输数据以进行计算的唯一方法。但是,Spark 文档并没有过多说明适当的用例。我上面描述的是否适合广播变量?是否可以接受甚至可能将数据帧用作广播变量?我是否有其他更好的途径可以快速连接此类数据框?
这是否真的更快取决于小数据集的大小以及您希望更改它们的频率。
在任何情况下,您都不能广播 Spark DataFrame
而是需要将小数据集广播为普通变量/结构。我还建议尝试mapPartitions
join
而不是普通map
,看看这是否会加快速度。
另外:您将无法在worker例程中使用Spark的join
,但必须定义自己的例程或使用可以处理数据集类型的库的join
例程。