【发布时间】:2018-06-17 03:35:29
【问题描述】:
我对 Spark 2.1 中的 join 有疑问。 Spark(错误地?)选择了广播哈希join,尽管表非常大(1400 万行)。该作业随后因内存不足而崩溃,Spark 以某种方式尝试将广播片段保存到磁盘,这会导致超时。
所以,我知道有一个查询提示可以强制广播加入 (org.apache.spark.sql.functions.broadcast),但是还有办法强制另一个加入算法吗?
我通过设置spark.sql.autoBroadcastJoinThreshold=0 解决了我的问题,但我更喜欢另一种更精细的解决方案,即不全局禁用广播连接。
【问题讨论】:
-
您尝试加入的两个表都很大?您可以尝试更改顺序吗?如果您正在执行 table1.leftjoin(table2)。你可以用 table2.leftjoin(table1) 重新运行吗?
-
@SanchitGrover 是的,两者都很大。顺序无关紧要。
-
只需在为您的应用程序创建 spark session / sqlcontext 时提供该属性,然后它将特定于该应用程序,它不会更改任何全局设置。
-
尝试在您的驱动程序代码中加入之前设置它,并在执行特定加入之后重置它,但 DAG 在这里很重要,如果其他加入也是同一作业的一部分(相同的操作),那么它可能会影响他们也是。
-
您可以在问题中加入
yourQuery.explain吗?
标签: scala apache-spark apache-spark-sql