如何提示排序合并连接或混洗散列连接(以及跳过广播散列连接)?

时间:2018-01-08 06:51:03

标签: scala apache-spark apache-spark-sql

我在Spark 2.1中遇到join的问题。 Spark(错误地?)选择广播哈希join,尽管表格非常大(1400万行)。然后该作业崩溃,因为没有足够的内存,Spark会以某种方式尝试将广播片段持久保存到磁盘,然后导致超时。

所以,我知道有一个查询提示强制广播连接(org.apache.spark.sql.functions.broadcast),但是还有一种强制另一种连接算法的方法吗?

我通过设置spark.sql.autoBroadcastJoinThreshold=0解决了我的问题,但我更倾向于使用另一种更精细的解决方案,即不全局禁用广播连接。

2 个答案:

答案 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。