如何提示排序合并连接或混洗哈希连接(并跳过广播哈希连接)?

Rap*_*oth 7 scala apache-spark apache-spark-sql

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

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

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

Jac*_*ski 5

如果可以使用广播哈希连接(通过广播提示或关系的总大小),Spark SQL 会选择它而不是其他连接(请参阅JoinSelection执行计划策略)。

话虽如此,不要强制广播散列连接(broadcast在左侧或右侧连接侧使用标准函数)或禁用广播散列连接的首选项使用spark.sql.autoBroadcastJoinThresholdbe0或negative。