前言
在Spark中,結構化查詢可以通過指定查詢提示(hint)來進行優化。
查詢提示,即向查詢加入注釋,告訴查詢優化器提供如何優化邏輯計划, 這在查詢優化器無法做出最佳決策時十分有用。
Spark SQL支持COALESCE,REPARTITION以及BROADCAST提示。 在分析查詢語句時,所有剩余的未解析的提示將從查詢計划中被移除。
Spark SQL 2.2增加了對提示框架(Hint Framework)的支持。
如何使用查詢提示hint
我們可以使用Dataset.hint運算符或帶有提示的SELECT SQL語句指定查詢提示。
// Dataset API
val q = spark.range(1).hint(name = "myHint", 100, true)
val plan = q.queryExecution.logical
scala> println(plan.numberedTreeString)
00 'UnresolvedHint myHint, [100, true]
01 +- Range (0, 1, step=1, splits=Some(8))
// SQL
val q = sql("SELECT /*+ myHint (100, true) */ 1")
val plan = q.queryExecution.logical
scala> println(plan.numberedTreeString)
00 'UnresolvedHint myHint, [100, true]
01 +- 'Project [unresolvedalias(1, None)]
02 +- OneRowRelation
SELECT SQL語句支持查詢提示作為SQL查詢中的注釋,Spark SQL將其轉換為邏輯計划中的UnresolvedHint一元邏輯運算符。
COALESCE 和 REPARTITION 提示
Spark SQL 2.4增加了對COALESCE和REPARTITION提示的支持(使用SQL注釋), 語法如下:
SELECT /*+ COALESCE(5) */ …
SELECT /*+ REPARTITION(3) */ …
Broadcast提示
Spark SQL 2.2支持使用廣播標准函數或SQL注釋的BROADCAST提示 ,語法如下:
SELECT /*+ MAPJOIN(b) */ …
SELECT /*+ BROADCASTJOIN(b) */ …
SELECT /*+ BROADCAST(b) */ …