我有一个问题 join
在 Spark 2.1 中。 Spark(错误地?)选择广播哈希 join
尽管表非常大(1400 万行)。然后作业崩溃,因为没有足够的内存,Spark 以某种方式尝试将广播片段持久化到磁盘,然后导致超时。
所以,我知道有一个查询提示可以强制进行广播连接( org.apache.spark.sql.functions.broadcast
),但是还有一种方法可以强制使用另一种连接算法吗?
我通过设置 spark.sql.autoBroadcastJoinThreshold=0
解决了我的问题,但我更喜欢另一种更精细的解决方案,即不要全局禁用广播连接。
最佳答案
如果可以使用广播散列连接(通过广播提示或关系的总大小),Spark SQL 会选择它而不是其他连接(参见 JoinSelection 执行计划策略)。
话虽如此,不要强制广播散列连接(在左侧或右侧连接侧使用 broadcast
标准函数)或使用 spark.sql.autoBroadcastJoinThreshold
禁用广播散列连接的首选项。成为 0
或消极。
关于scala - 如何提示排序合并连接与随机散列连接(并跳过广播散列连接)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48145514/