Spark数据集错误:此连接的两端都在广播阈值之外,并且计算它可能非常昂贵

时间:2016-11-24 06:11:44

标签: sql performance apache-spark dataframe dataset

我在本地模式下使用Spark2.0.2。我有一个连接两个数据集的连接。

使用spark sql或dataframe API(无类型数据集[Row])时速度非常快。 但是当我使用类型化的数据集API时,我得到以下错误。

线程中的异常" main" org.apache.spark.sql.AnalysisException:此连接的两端都在广播阈值之外,并且计算它可能非常昂贵。要明确启用它,请设置spark.sql.crossJoin.enabled = true;

我增加" spark.sql.conf.autoBroadcastJoinThreshold",但它仍然是同样的错误。然后我设置" spark.sql.crossJoin.enabled" to" true",它可以工作,但需要很长时间才能完成。

我没有做任何重新分配。来源是两个小区。

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

自动广播阈值仅限于2GB(https://issues.apache.org/jira/browse/SPARK-6235),因此如果表格大小超过此值,您将无法执行此操作。 解决方法可能是使用广播功能为sparksql提供提示,如下所示:

largeTableDf.join(broadcast(smallTableDf), "key"))

答案 1 :(得分:0)

我找到了原因。 在我的ds1中,还有一个字段" key2"这与ds2的join键相同。 将ds2(" key2")重命名为ds2(" key3")后,下面的连接现在很快。

ds1.joinWith(广播(ds2),ds1(" key1")=== ds2(" key3")," left_outer")

有人可以解释原因吗?