我在Spark 2.1中遇到join
的问题。 Spark(错误地?)选择广播哈希join
,尽管表格非常大(1400万行)。然后该作业崩溃,因为没有足够的内存,Spark会以某种方式尝试将广播片段持久保存到磁盘,然后导致超时。
所以,我知道有一个查询提示强制广播连接(org.apache.spark.sql.functions.broadcast
),但是还有一种强制另一种连接算法的方法吗?
我通过设置spark.sql.autoBroadcastJoinThreshold=0
解决了我的问题,但我更倾向于使用另一种更精细的解决方案,即不全局禁用广播连接。
答案 0 :(得分:2)
如果可以使用广播散列连接(通过广播提示或关系的总大小),Spark SQL会选择其他连接(请参阅JoinSelection执行计划策略)。
话虽如此,不要强制广播散列连接(在左侧或右侧连接侧使用broadcast
标准函数)或禁用使用spark.sql.autoBroadcastJoinThreshold
的广播散列连接的首选项{ {1}}或否定。
答案 1 :(得分:0)
根据Jacek的响应,将spark.sql.autoBroadcastJoinThreshold设置为0或为负值,然后检查“ spark.sql.join.preferSortMergeJoin”的状态
提示“排序合并”联接:将上述conf设置为true
“哈希混搭”联接的提示:将上面的conf设置为false。