scala之如何拆分一个大数据帧并使用较小的部分在 Spark 中进行多个广播连接
假设我们有两个非常大的数据帧——A 和 B。现在,我知道如果我对两个 RDD 使用相同的哈希分区器然后进行连接,键将位于同一位置并且连接可能会更快减少洗牌(唯一会发生的洗牌是当分区程序在 A 和 B 上发生变化时)。
虽然我想尝试一些不同的东西 - 我想像这样尝试广播连接 -> 假设 B 比 A 小,所以我们选择 B 进行广播,但 B 仍然是一个非常大的数据帧。所以,我们要做的是从 B 中生成多个数据帧,然后将每个数据帧作为广播发送到 A 上。
有人试过吗? 要将一个数据帧拆分为多个数据帧,我只看到了 randomSplit 方法,但这看起来不是一个很好的选择。
还有其他更好的方法来完成这项任务吗?
谢谢!
请您参考如下方法:
Has anyone tried this?
是的,有人已经尝试过了。特别是 GoDataDriven。您可以在下面找到详细信息:
- 演示 - https://databricks.com/session/working-skewed-data-iterative-broadcast
- 代码 - https://github.com/godatadriven/iterative-broadcast-join
他们声称对偏斜数据有很好的结果,但是您必须自己考虑三个问题:
- Spark 中没有拆分。您必须多次过滤数据或急切地缓存完整分区 ( How do I split an RDD into two or more RDDs? ) 以模仿“拆分”。
- 广播的巨大优势是减少了传输的数据量。如果数据很大,那么要传输的数据量实际上会显着增加:( Why my BroadcastHashJoin is slower than ShuffledHashJoin in Spark )
- 每次“加入”都会增加执行计划的复杂性,并且随着一系列的转换,驱动程序方面的事情会变得非常缓慢。
randomSplit method but that doesn't look so great an option.
其实还不错。
Any other better way to accomplish this task?
您可以尝试按分区 ID 进行过滤。
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。



