当我使用sparkSQL时,如何广播tempTable而不是“ sort merge join”?

时间:2018-11-04 02:15:55

标签: apache-spark-sql broadcast

我将autoBroadcast设置为200M,表a为20KB,表b为20KB,表c为100G。 我发现“ a上的左连接b”是“广播连接”,并将结果注册为“ TempTable”(TempTable为30KB),我的问题是当我执行“ c左连接b ...”时,我希望自动广播TempTable可以进行广播联接,但它进行了排序合并联接。我也尝试过缓存TempTable并广播TempTable的DataFrame,但是它不起作用... 如何广播TempTable以便通过sparkSQL进行广播联接? 我正在使用spark-1.6.1 谢谢!

1 个答案:

答案 0 :(得分:1)

尽管没有任何代码片段很难理解您到目前为止已经尝试了什么。我正在分享一些在Spark 2.3上尝试过的示例代码,其中在Temp View上应用了广播功能(因为Spark2中不推荐使用Temp表)。在以下scala代码中,我已强制使用广播哈希联接。

import org.apache.spark.sql.functions.broadcast
val adf = spark.range(99999999)
val bdf = spark.range(99999999)
adf.createOrReplaceTempView("a")
bdf.createOrReplaceTempView("b")
val bdJoinDF = spark.sql("select /*+ BROADCASTJOIN(b) */a.id, b.id from a join b on a.id = b.id")
val normalJoinDF = spark.sql("select a.id, b.id from a join b on a.id = b.id")
println(normalJoinDF.queryExecution) //== Physical Plan == *(5) SortMergeJoin [id#39512L], [id#39514L], Inner
println(bdJoinDF.queryExecution) //== Physical Plan == *(2) BroadcastHashJoin [id#39611L], [id#39613L], Inner, BuildRight, false