Как я могу транслировать tempTable вместо "сортировки слиянием соединения", когда я использую sparkSQL? - PullRequest
0 голосов
/ 04 ноября 2018

Я установил autoBroadcast 200M, таблица a - 20 КБ, таблица b - 20 КБ, таблица c - 100 ГБ. Я обнаружил, что «левое соединение b на ...» является «широковещательным соединением», и зарегистрировал результат как «TempTable» (TempTable составляет 30 КБ), мой вопрос, когда я делаю «c левым соединением TempTable на ...», я ожидайте, что автоматическая трансляция TempTable для создания широковещательного соединения, но она сделала сортировку слиянием. Я также пытался кэшировать TempTable и транслировать DataFrame из TempTable, но это не работает ... Как я могу транслировать TempTable, чтобы сделать широковещательное соединение с помощью sparkSQL? Я использую spark-1.6.1 спасибо!

1 Ответ

0 голосов
/ 08 ноября 2018

Хотя без фрагмента кода очень трудно понять, что вы уже пробовали. Я делюсь некоторыми примерами кода, которые пробовал в Spark 2.3, где функция широковещания была применена к представлению Temp (так как таблица Temp устарела в Spark2). В следующем коде 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
...