scala - 强制存储在驱动程序节点上的 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 的理念,但如果可能的话,我想尝试将它与我目前的方法进行比较。
解决方案
连接是在执行程序而不是驱动程序处执行的。只要您使用连接右侧的小数据集,Spark 就会在适当的情况下自动执行广播连接。
推荐阅读
- azure - Azure 应用程序网关外部 URL 重写
- javascript - 如何使用 PHP 保存已编辑的页面?
- javascript - 如何避免堆内存不足?
- python - 坏:无法在 ubuntu(python)中完成“os.path.dirname(__file)”(谷歌云语音)
- firebase - How can I get a token?
- c# - 无法使用 FNV-1 算法检查密钥分配
- arrays - 从字符串数组中选择有效 IP
- c# - WPF UI not updating and not sure why?
- oracle - 表空间段和模式对象
- mysql - MySQL Update 子查询表被指定了两次